为什么“ auto ch = unsigned char {'p'}”不能在C ++ 17下编译?

时间:2019-03-01 14:59:19

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

我很困惑。 const auto ch = unsigned char{'p'};是不是一个完全有效的初始化表达式?无法由所有三个主要的编译器进行编译,并显示几乎相同的错误消息:

  

错误:函数样式转换或类型构造应为'('

('p')交换花括号不会改变任何内容。 但是,它可以在没有signedunsigned关键字的情况下进行编译。

Online demo.

1 个答案:

答案 0 :(得分:42)

因为只能将单个单词类型的名称用于这种explicit type conversion

  

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

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