Чтобы дать контекст того, о чем я говорю, следующая программа корректно печатает 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
как их истинные динамические типы?