为什么构造函数语法不能与“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 ...);
(除了Type
是unsigned 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);