标题有点冗长,代码更好地演示了问题:
// Equivalent to क़
constexpr auto arr = std::array<char, 3>{static_cast<char>(0340),
static_cast<char>(0245),
static_cast<char>(0230)};
int main()
{
constexpr auto a = std::string_view{"क़"};
constexpr auto b = std::string_view{arr.data(), arr.size()};
static_assert(a.size() == 3);
static_assert(b.size() == 3);
static_assert(a[0] == b[0]);
static_assert(a[1] == b[1]);
static_assert(a[2] == b[2]);
static_assert(a == b);
return EXIT_SUCCESS;
}
最后一个static_assert
在MSVC上失败,但在gcc和clang上可以。起初,我认为Windows可能不太支持UTF-8,但它在运行时运行良好:
int main()
{
constexpr auto a = std::string_view{"क़"};
constexpr auto b = std::string_view{arr.data(), arr.size()};
return a == b ? EXIT_SUCCESS : EXIT_FAILURE;
}
将/utf-8
添加到编译器参数中没有任何区别。这似乎是一个Unicode/UUTF-8问题,因为一个普通的ASCII字符串可以工作:
// foo
constexpr auto arr = std::array<char, 3>{'f', 'o', 'o'};
int main()
{
constexpr auto a = std::string_view{"foo"};
constexpr auto b = std::string_view{arr.data(), arr.size()};
static_assert(a == b);
return EXIT_SUCCESS;
}
这感觉像是一个编译器错误,但我不是语言律师,所以可能是我在做一些我不应该做的事情——有人能看到吗?
这是一个编译器错误,Microsoft开发人员似乎已经意识到了,请参阅此针对标准库的错误报告。
由于内置的__builtin_memcmp
有一个错误,将具有[0127]范围外字节的窄字符串文字与非字符串文字进行比较目前在编译时似乎失败了。
这个问题已经存在一年了,但我找不到它的更新。