为什么构造函数语法不能与"unsigned int"类型一起使用?

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]

简单的类型说明符是

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 )
Run Code Online (Sandbox Code Playgroud)

  • 引用和答案都说不同的东西; 请注意引号中的冒号`:`.引用说明说明符必须是**单字类型名称**,但答案是"单字类型说明符无效". (2认同)

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)

  • 我也不确定.你会建议什么?解析优先级?我正在编辑那种方式. (3认同)
  • 解析优先级可能足够清楚,但这实际上只是语言语法的规则.函数样式转换必须是单个标识符. (3认同)
  • 我不确定"运算符优先级"是否是正确的术语. (2认同)