【问题标题】:Why w/cout does not support string U/u prefixes?为什么 w/cout 不支持字符串 U/u 前缀?
【发布时间】:2017-10-20 01:33:58
【问题描述】:

我有以下受 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"; 
}

导致:

cout 有类似的输出。

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

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

我的问题是:

1- 为什么它不支持这些类型?语言不支持自己的类型不是很奇怪吗? 2- 是否有任何已知计划在可预见的未来添加此类支持?

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

【问题讨论】:

  • 编码和(宽)字符表示是正交的东西。 IMO 在您链接的问题中得到了回答。
  • @πάνταῥεῖ 我知道u8"" 字符串文字存在歧义,因为它映射到没有关联编码的const char[],但u"" 映射到const char16_t[]U"" 映射到 const char32_t[],根据 this reference 暗示 UTF-16 / UTF-32 编码。
  • @zett42 好吧,这就是为什么我一直在支持这个问题(我自己在理解这个问题时遇到了一些问题;-))。

标签: c++ string iostream cout


【解决方案1】:

标准库遗漏的通常答案适用:没有人建议为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)我怀疑是否有人对创建提案感兴趣。

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2022-12-24
    • 1970-01-01
    • 2014-03-27
    • 2022-10-09
    • 1970-01-01
    • 2019-05-30
    • 2018-11-03
    相关资源
    最近更新 更多