【问题标题】:what is this + before u8 string literal prefix for?u8 字符串文字前缀之前的这个 + 是什么?
【发布时间】:2022-01-26 06:31:07
【问题描述】:

当我阅读cppref 中的codecvt 示例时,我注意到了这一行:

std::string data = reinterpret_cast<const char*>(+u8"z\u00df\u6c34\U0001f34c");

知道u8 之前的+ 是什么吗?因为我删除了它,结果没有任何改变。

【问题讨论】:

  • cppreference 上的示例可能是在使用早期 C++ 标准时编写的。我不知道,但也许自 C++11 以来情况发生了变化?
  • @AdrianMole 我认为问题从 C++20 开始,其中 u8char8_t。然后将 char8_t[N] 从字符串文字转换为 char* 将无效。所以它首先使用+ 将其转换为char8_t*。虽然编译器用类似的行为编译它,但也许它是没有+的UB。
  • ...在这种情况下,建议的副本可能是正确的?
  • ...但我几乎没有足够的信心将这个作为副本关闭! (这把锤子意味着——理论上——我是 C++ 专家;然而,这也意味着我很小心单方面结束问题!!)

标签: c++ c++11


【解决方案1】:

+“显式”执行数组到指针的隐式转换,生成纯右值 const char8_t*(或 C++20 之前的 const char*),而不是左值数组。

这是不必要的,因为reinterpret_cast&lt;T&gt;(当T 不是参考时)无论如何都会执行此转换。

(可能是为了防止与类似的reinterpret_cast&lt;const char* const&amp;&gt;(u8"...")混淆,它将数组的字节解释为指针,这显然不是我们想要的。但我个人不会担心这个)

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 2011-01-28
    • 2022-10-09
    • 2017-04-29
    • 2022-12-24
    • 2011-09-02
    相关资源
    最近更新 更多