为什么w / cout不支持字符串U / u前缀?

时间:2017-05-19 20:02:17

标签: c++ string iostream cout

我有以下代码的灵感来自其中一个SO问题:

int main()
{
    wcout << "\n\n 1- Test normal string with wcout \n";
    wcout << u8"\n 2- Test (u8) string with wcout  \n";
    wcout << u"\n 3- Test (u) string with wcout \n";
    wcout << U"\n 4- Test (U) string with wcout \n";
    wcout << L"\n 5- Test (L) string with wcout \n\n"; 
}

导致:

Output

cout有类似的输出。

我从this post的答案中了解到,w / cout不支持字符串U / u前缀,或完全如上所述:

  

同时std::cout's类对<<const char16_t*const char32_t*没有特殊的const wchar_t*重载,因此它会匹配   <<打印指针的重载。

我的问题是:

1-为什么它不支持这些类型?对于不支持自己类型的语言来说,这不是很奇怪吗? 2-是否有任何已知的计划在未来看到增加这种支持?

我知道iostream是一个库,但实际上它仍然是该语言的一部分。

1 个答案:

答案 0 :(得分:0)

适用标准库遗漏的常见答案:没有人建议为char16_t const*char32_t添加重载。添加字符类型(N2249)的建议不包含相关的库部分。特别是,它没有为

添加重载
template <typename charT, typename Traits>
std::basic_ostream<charT, Traits>& std::operator<< (std::basic_ostream<charT, Traits>&, char16_t const*);
template <typename charT, typename Traits>
std::basic_ostream<charT, Traits>& std::operator<< (std::basic_ostream<charT, Traits>&, char32_t const*);

由于这些运算符的重载是void const*,因此将打印指针的地址。由于新的字符类型毫无意义(至少,从我的角度来看:仅使用UTF8),我怀疑是否有人对创建建议感兴趣。