括号初始化列表和无符号类型

时间:2018-11-16 10:49:56

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

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的错误)?如果没有,为什么不呢?除无符号类型外,还有哪些类型会受到相同的限制?

2 个答案:

答案 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不是单个单词   类型名称;简而言之。