36 votes

Pourquoi constructeur syntaxe pas être utilisé avec le "unsigned int" type?

Pourquoi est la suivante illégale en C++?

auto x = unsigned int(0);

Alors que les suivants sont tous OK:

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

ou en général:

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

(à l'exception de l' Type être unsigned int).

34voto

songyuanyao Points 2265

La syntaxe est une conversion de type Explicite (notation fonctionnelle) ici. Selon la règle grammaticale, il ne fonctionne qu'avec de simples spécificateur de type ou définition de type de prescripteurs (c'est à dire un seul mot nom du type).

(l'emphase est mienne)

2) La fonctionnelle de la fonte d'expression consiste en un simple spécificateur de type ou un typedef spécificateur (en d'autres termes, un seul type de mot nom: unsigned int(expression) ou int*(expression) ne sont pas valides), suivie par une seule expression entre parenthèses. Cette expression cast est exactement équivalent à la C-style fonte d'expression.

Vous pouvez changer de style c fonte d'expression ou d' static_cast, ou de l'utiliser avec typedef spécificateur comme @Jean-FrançoisFabre suggéré.

auto x1 = (unsigned int)(0);
auto x2 = static_cast<unsigned int>(0);

Citations de la norme, $5.2.3/1 une conversion de type Explicite (fonctionnelle notation) [expr.type.conv]

Un type simple spécificateur ([dcl.type.simple]) ou typename spécificateur ([temp.res]), suivie par une mise entre parenthèses d'expression en option-liste ou par un arc-boutée-init-liste (l'initialisation) des constructions d'une valeur du type spécifié compte tenu de l'initialiseur.

Et $7.1.7.2/1 Simple spécificateurs de type [dcl.type.simple]

Le type simple prescripteurs sont

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 )

21voto

Jean-François Fabre Points 94672

En raison de l'analyse de priorité. Le compilateur est perdu parce qu' int(0) correspondance est avant unsigned int.

Vous devez joindre à votre type entre parenthèses:

auto x = (unsigned int)(0);

ou utiliser un typedef:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X