使用简单类型说明符

时间:2016-08-16 14:37:54

标签: c++ gcc visual-c++ type-conversion language-lawyer

移植一些代码我发现了这行

unsigned char uc = unsigned char(c);

被MSVC接受但被GCC拒绝。这种语法是否正确?
标准说

  

简单类型说明符(7.1.7.2)...后跟括号   可选的表达式列表或braced-init-list(初始化程序)   给定初始值设定项

构造指定类型的值

这是否意味着MS是对的? unsigned char是'简单类型说明符'?

2 个答案:

答案 0 :(得分:8)

GCCCLANG是正确的,代码无效。

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);