c++ reinterpret_cast用法 為什麼構造函數語法不能與“unsigned int”類型一起使用?




reinterpret_cast用法 (2)

因為解析優先級。 編譯器丟失,因為int(0)unsigned int之前匹配。

您必須將您的類型括在括號中:

auto x = (unsigned int)(0);

或使用typedef:

typedef unsigned int uint;
auto x = uint(0);

為什麼C ++中的以下內容是非法的?

auto x = unsigned int(0);

以下都可以:

auto y = int(0);
auto z = unsigned(0);
auto w = float(0);

或者一般來說:

auto t = Type(... c-tor-args ...);

Typeunsigned int除外)。


Answer #1

語法是顯式類型轉換(功能表示法) 。 根據語法規則,它只適用於簡單的類型說明符或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);

來自標準的報價, $ 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 )




language-lawyer