【问题标题】:Explicit type conversion (functional notation) with simple-type-specifier使用简单类型说明符的显式类型转换(功能表示法)
【发布时间】:2016-12-23 00:00:29
【问题描述】:

移植一些我发现的代码

unsigned char uc = unsigned char(c);

被 MSVC 接受但被 GCC 拒绝。这个语法正确吗?
标准说

简单类型说明符 (7.1.7.2) ... 后跟括号 可选的表达式列表或由一个花括号初始化列表(初始化器) 在给定初始化器的情况下构造指定类型的值

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

【问题讨论】:

  • 什么是(变量?)c?
  • 看起来像一个 MSVC 扩展。根据cppreference,一个简单的类型说明符是charunsgined(这里推导出int)。规则列表没有描述unsigned char 可以被视为一个的方式。但是你可以typedef 它,并且 that 将被视为一个简单的类型说明符。
  • @StoryTeller 好电话。也许MSVS使用表9而不是[dcl.type.simple]中的第1段
  • @NathanOliver,一定是它!但是表格和段落之间的差异有点令人讨厌......尤其是考虑到表格的描述。
  • @songyuanyao 啊哈!我没有阅读第 2 段。尽管 Table 9 — simple-type-specifiers 和它们指定的类型只是阅读了表格的标题,这让我感到模棱两可。

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


【解决方案1】:

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 所示。

表 [tab:simple.type.specifiers] 总结了简单类型说明符的有效组合及其指定的类型。

表 9 — 简单类型说明符及其指定的类型

Specifier(s)  Type
...
unsigned char     “unsigned char” 
...

Here 来自 cppreference.com 的解释:

2) 函数转换表达式由一个简单的类型说明符或一个 typedef 说明符组成(换句话说,单字类型名称:unsigned int(expression)int*(expression) 无效),后跟括号中的单个表达式.

【讨论】:

    【解决方案2】:

    或者你可以使用:

    unsigned char uc = static_cast<unsigned char>(c);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多