移植一些代码我发现了这行
unsigned char uc = unsigned char(c);
被MSVC接受但被GCC拒绝。这种语法是否正确?
标准说
简单类型说明符(7.1.7.2)...后跟括号 可选的表达式列表或braced-init-list(初始化程序) 给定初始值设定项
构造指定类型的值
这是否意味着MS是对的? unsigned char
是'简单类型说明符'?
答案 0 :(得分:8)
Simple type specifier是单字类型名称:
简单类型说明符是
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 )
unsigned char
不是简单类型说明符,它是简单类型说明符的组合,如标准中的Table 9所示。
Table [tab:simple.type.specifiers]总结了simple-type-specifiers的有效组合及其指定的类型。
表9 - 简单类型说明符及其指定的类型
Specifier(s) Type ... unsigned char “unsigned char” ...
Here来自cppreference.com的解释:
2)函数强制转换表达式由简单的类型说明符或typedef说明符组成(换句话说,单字类型名称:
unsigned int(expression)
或int*(expression)
无效),后跟一个括号中的单个表达。
答案 1 :(得分:-2)
或者您可以使用:
unsigned char uc = static_cast<unsigned char>(c);