【问题标题】:Why doesn't "auto ch = unsigned char{'p'}" compile under C++ 17?为什么“auto ch = unsigned char{'p'}”不能在 C++ 17 下编译?
【发布时间】:2019-07-23 15:16:15
【问题描述】:

我很困惑。 const auto ch = unsigned char{'p'}; 不是一个完全有效的初始化表达式吗?三个主要编译器都编译失败,错误信息几乎相同:

错误:对于函数式强制转换或类型构造,预期为 '('

用大括号替换('p') 不会改变任何事情。 但是,它确实可以在没有 signedunsigned 关键字的情况下进行编译。

Online demo.

【问题讨论】:

  • @FrançoisAndrieux:const auto ch = static_cast<unsigned char>('p') 也是如此,但那是转换,而不是初始化。
  • using T = unsigned char; const auto ch = T{'p'}; 似乎有效。
  • @FrançoisAndrieux:嗯,您认为编译器在这种情况下根本无法将 unsigned char 解析为单个类型名称吗?
  • const auto ch = (unsigned char){'p'};?

标签: c++ c++14 language-lawyer c++17


【解决方案1】:

因为这种explicit type conversion只能使用单字类型名称。

后跟花括号初始化列表的单字类型名称是指定类型的纯右值designating a temporary (until C++17) whose result object is (since C++17) 使用指定的花括号初始化列表初始化的直接列表。

unsigned char 不是单字类型名称,而 char 是。函数式转换表达式也是如此,这就是为什么('p') 也不起作用。

作为解决方法,您可以

using uc = unsigned char;  // or use typedef
const auto ch = uc{'p'};

或将其更改为其他演员表样式。

const auto ch = (unsigned char) 'p';  // c-style cast expression
const auto ch = static_cast<unsigned char>('p');  // static_cast conversion

【讨论】:

  • 你知道这个限制的原因吗?比如,如果这里允许使用多字类型名称,还有什么东西会被破坏?
  • @VioletGiraffe 老实说我不知道​​;我只知道标准是这么说的。
  • @VioletGiraffe 因为uc{'p'}/uc('p') 是一个函数转换。函数名中不能有空格,因此类型名也不能。
  • @NathanOliver 函数转换并不是真正的函数调用。
  • C 风格的演员阵容,真的吗? static_cast 怎么样(或者如果使用 Boost,boost::implicit_cast)?准确地说,该语言允许simple-type-specifier 或(在模板中)typename-specifier,顺便说一句,在函数样式转换中。您关于“不能有空格”的说法有点误导,因为例如std :: uint8_t 有空格并且是一个有效的simple-type-specifier
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2013-01-19
  • 2011-10-15
  • 2012-07-01
相关资源
最近更新 更多