Подтвердить что ты не робот

Почему синтаксис конструктора не может использоваться с типом "unsigned int"?

Почему в С++ допустимо следующее:

auto x = unsigned int(0);

В то время как все в порядке:

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

или вообще:

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

(за исключением Type, являющегося unsigned int).

4b9b3361

Ответ 1

Синтаксис Явное преобразование типа (функциональная нотация) здесь. Согласно грамматическому правилу он работает только с простым спецификатором типа или спецификатором typedef (т.е. С именем одного слова).

(акцент мой)

2) Функциональное выражение выражений состоит из простого спецификатора типа или спецификатора typedef (, другими словами, однотипное имя типа: unsigned int(expression) или int*(expression) недействительно), за которым следует одно выражение в круглых скобках. Это выраженное выражение точно эквивалентно соответствующему выражению в стиле C.

Вы можете изменить его на выражение выражения c-style или 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]), за которым следует произвольный список выражений в скобках или строковые элементы-инициализаторы значение указанного типа, заданное инициализатором.

И $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 )

Ответ 2

Из-за разбора приоритета. Компилятор потерян, потому что int(0) соответствует до unsigned int.

Вы должны заключить свой тип в круглые скобки:

auto x = (unsigned int)(0);

или используйте typedef:

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