basic_regex 抛出 bad_cast 和 char32_t

basic_regex throws bad_cast with char32_t

为什么下面的代码会产生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)。

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

To use std::basic_regex with other character types (for example, char32_t), a user-provided trait class must be used.

所以你必须实施 std::regex_traits<char32_t>

并查看为什么没有定义,请参见此处:

在 GCC 或 Clang 上,即使使用自定义正则表达式特征,代码也能很好地编译,但在运行时失败并显示 std::bad_cast。如果您在这里,问题来自 std::use_facet<std::ctype<char32_t>> 抛出错误,因为当前语言环境不支持它。您必须专门化 std::ctype<char32_t> 并通过 std::locale::global 将全局语言环境设置为使用旧语言环境和特殊方面构建的新语言环境。