basic_regex使用char32_t抛出bad_cast

时间:2016-08-24 14:55:26

标签: c++ regex casting stdstring

为什么以下代码会生成std::bad_cast例外?

#include <iostream>
#include <regex>
#include <string>

int main()
{
    std::basic_string<char32_t> reg = U"^\\w";

    try
    {
        std::basic_regex<char32_t> tagRegex(reg);
    }
    catch(std::exception &e)
    {
        std::cout << e.what() << std::endl;
    }

    return 0;
}

为方便起见,这个示例在Ideone上:https://ideone.com/Saea88

使用charwchar代替char32_t但不会抛出(证据:https://ideone.com/OBlXed)。

2 个答案:

答案 0 :(得分:2)

您可以在此处找到:http://en.cppreference.com/w/cpp/regex/regex_traits

  

要将std :: basic_regex与其他字符类型(例如,char32_t)一起使用,必须使用用户提供的特征类。

因此您必须实施std::regex_traits<char32_t>

并了解为何没有定义,请参阅此处:Why is there no definition for std::regex_traits<char32_t> (and thus no std::basic_regex<char32_t>) provided?

答案 1 :(得分:1)

在GCC或Clang上,即使使用自定义正则表达式特征,代码也可以正常编译,但是在运行时使用std::bad_cast失败。如果您遇到问题,则可能是由于std::use_facet<std::ctype<char32_t>>引发了错误,因为当前语言环境不支持此错误。您必须对std::ctype<char32_t>进行专门化,然后通过std::locale::global将全局语言环境设置为使用旧环境和专门性构面构造的新语言环境。