gcc 8和clang 7不接受以下代码,这些代码应默认构造unsigned int
类型的临时文件:
unsigned int ui = unsigned int{};
clang 7报告错误,例如
<source>:6:22: error: expected primary-expression before 'unsigned'
Visual C ++ 2015和2017接受此要求。
很明显,这适用于int
之类的类型,或任何默认可构造的类类型。
这是正确的C ++ 14代码(在这种情况下是clang和gcc的错误)?如果没有,为什么不呢?除无符号类型外,还有哪些类型会受到相同的限制?
答案 0 :(得分:8)
new_type { expression-list(optional) }
类似于unsigned int{}
符合explicit type conversion的语法,该语法仅允许使用单字类型名称。
单字类型名称后跟一个括号初始列表是指定类型
designating a temporary (until C++17)
whose result object is (since C++17)
的prvalue,直接用指定的括号初始列表初始化列表。
请注意,unsigned int
不是单字类型名称,而int
是单字类型名称。因此int {}
可以正常工作。
这与功能强制转换表达式
相同函数强制转换表达式由简单的类型说明符或typedef说明符组成(换句话说,单字类型名称:
unsigned int(expression)
或int*(expression)
无效),
作为解决方法,您可以应用类型别名,例如
using type = unsigned int;
type ui = type{};
答案 1 :(得分:3)
“ Int”在“ unsigned int”中是可选的。
只需尝试:
unsigned ui = unsigned{};
有效。
编辑: 我找到了这个答案: inline formset
这仅仅是因为在其中只能使用单字类型名称 功能强制转换表达式,而无符号short不是单个单词 类型名称;简而言之。