Sim*_*mon 7 c++ initialization language-lawyer c++14
gcc 8和clang 7不接受以下代码,它们应该默认构造一个临时类型unsigned int:
unsigned int ui = unsigned int{};
Run Code Online (Sandbox Code Playgroud)
clang 7报告错误,例如
<source>:6:22: error: expected primary-expression before 'unsigned'
Run Code Online (Sandbox Code Playgroud)
Visual C++ 2015和2017接受此.
显然,这适用于诸如int或任何默认可构造类类型之类的类型.
这是正确的C++ 14代码(在这种情况下是clang和gcc的错误)?如果没有,为什么不呢?除了无符号类型之外的哪些类型会受到相同的限制?
new_type { expression-list(optional) }喜欢unsigned int{}适合显式类型转换的语法,它只允许单字类型名称.
单字类型名称后跟braced-init-list是指定类型的prvalue,使用指定的braced-init-list进行
designating a temporary (until C++17)whose result object is (since C++17)direct-list-initialized.
请注意,这unsigned int不是单字类型名称,int而是.因此,int {}工作正常.
这与功能演员表达相同,
函数强制转换表达式由简单的类型说明符或typedef说明符组成(换句话说,单字类型名称:
unsigned int(expression)或int*(expression)无效),
作为解决方法,您可以应用类型别名,例如
using type = unsigned int;
type ui = type{};
Run Code Online (Sandbox Code Playgroud)