Чтобы дать контекст того, о чем я говорю, следующая программа корректно печатает true при компиляции с помощью clang++/libС++
#include <iostream>
#include <regex>
int main()
{
std::locale::global(std::locale("en_US.UTF-8"));
std::wstring str = L"AÀÁÂÃÄÅaàáâãäå";
std::wregex re(L"[[=a=]]*", std::regex::basic);
std::cout << std::boolalpha << std::regex_match(str, re) << '\n';
}
однако я не могу полностью понять описание std::regex_traits::transform_primary() в стандарте (с помощью которого обрабатывается [=a=]). Для цитирования 28.7 [re.traits]/7:
если
typeid(use_facet<collate<charT> >) == typeid(collate_byname<charT>)и форма ключа сортировки, возвращаемаяcollate_byname<charT>::transform(first, last), известна и может быть преобразована в основной ключ сортировки, а затем возвращает этот ключ, в противном случае возвращает пустую строку.
Мой вопрос в том, как сравнение typeid в стандарте должно гарантировать это? Означает ли это, что все системные грани, выведенные из локалей с use_facet, имеют _byname как их истинные динамические типы?