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 )