为什么构造函数语法不能与“unsigned int”types一起使用?

为什么在C ++中以下是非法的?

auto x = unsigned int(0); 

以下是一切正常:

 auto y = int(0); auto z = unsigned(0); auto w = float(0); 

或一般:

 auto t = Type(... c-tor-args ...); 

(除了Typeunsigned int )。

这里的语法是显式types转换(function符号) 。 根据语法规则,它只能使用简单的types说明符或typedef说明符(即单个单词types的名称)。

(重点是我的)

2)函数强制转换expression式由一个简单的types说明符或一个typedef说明符组成( 换句话说,单字types名称: unsigned int(expression)int*(expression)无效 ),后跟单个expression式括号。 这个强制转换expression式完全等同于相应的C风格强制转换expression式。

您可以将其更改为c样式转换expression式或static_cast ,或者像@ Jean-FrançoisFabrebuild议的那样将其与typedef说明符一起使用。

 auto x1 = (unsigned int)(0); auto x2 = static_cast<unsigned int>(0); 

引用标准, $ 5.2.3 / 1显式types转换(function符号)[expr.type.conv]

一个简单types说明符([dcl.type.simple])或types名说明符([temp.res]),后面跟着一个带括号的可选expression式列表或一个braced-init-list(初始化程序),构造一个值给定初始化程序的指定types。

和$ 7.1.7.2 / 1简单types说明符[dcl.type.simple]

简单的types说明符是

 simple-type-specifier: nested-name-specifieropt type-name nested-name-specifier template simple-template-id nested-name-specifieropt template-name char char16_t char32_t wchar_t bool short int long signed unsigned float double void auto decltype-specifier type-name: class-name enum-name typedef-name simple-template-id decltype-specifier: decltype ( expression ) decltype ( auto ) 

由于parsing优先。 编译器丢失,因为int(0)unsigned int之前被匹配。

你必须把你的types括在括号里:

 auto x = (unsigned int)(0); 

或者使用typedef:

 typedef unsigned int uint; auto x = uint(0);