Art*_*ind 36 c++ type-conversion language-lawyer
为什么C++中的以下内容是非法的?
auto x = unsigned int(0);
Run Code Online (Sandbox Code Playgroud)
以下都可以:
auto y = int(0);
auto z = unsigned(0);
auto w = float(0);
Run Code Online (Sandbox Code Playgroud)
或者一般来说:
auto t = Type(... c-tor-args ...);
Run Code Online (Sandbox Code Playgroud)
(除了Type
存在unsigned int
).
son*_*yao 34
语法是显式类型转换(功能表示法).根据语法规则,它只适用于简单的类型说明符或typedef说明符(即单字类型名称).
(强调我的)
2)函数强制转换表达式由简单的类型说明符或typedef说明符组成(换句话说,单字类型名称:
unsigned int(expression)
或int*(expression)
无效),后跟括号中的单个表达式.此强制转换表达式与相应的C样式强制转换表达式完全等效.
您可以将其更改为c样式的转换表达式static_cast
,或者将其与typedef说明符一起使用,如@ Jean-FrançoisFabre建议的那样.
auto x1 = (unsigned int)(0);
auto x2 = static_cast<unsigned int>(0);
Run Code Online (Sandbox Code Playgroud)
来自标准的报价,$ 5.2.3/1显式类型转换(功能表示法)[expr.type.conv]
简单类型说明符([dcl.type.simple])或typename-specifier([temp.res])后跟带括号的可选表达式列表或braced-init-list(初始化程序)构造一个值给定初始化程序的指定类型.
和$ 7.1.7.2/1简单类型说明符[dcl.type.simple]
简单的类型说明符是
Run Code Online (Sandbox Code Playgroud)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 )
Jea*_*bre 21
因为解析优先级.编译器丢失,因为int(0)
之前匹配unsigned int
.
您必须将您的类型括在括号中:
auto x = (unsigned int)(0);
Run Code Online (Sandbox Code Playgroud)
或使用typedef:
typedef unsigned int uint;
auto x = uint(0);
Run Code Online (Sandbox Code Playgroud)