我很困惑。 const auto ch = unsigned char{'p'};
是不是一个完全有效的初始化表达式?无法由所有三个主要的编译器进行编译,并显示几乎相同的错误消息:
错误:函数样式转换或类型构造应为'('
为('p')
交换花括号不会改变任何内容。
但是,它可以在没有signed
或unsigned
关键字的情况下进行编译。
答案 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