Je ne comprends pas pourquoi le code suivant ne compile pas lorsqu'il utilise un casting de type constructeur :
template<typename T> void foo(const T& t){}
int main(){
foo(unsigned char(0));
}
Les erreurs sont :
-
error: expected primary-expression before ‘unsigned’
pour gcc. -
error: expected '(' for function-style cast or type construction
pour clang
Cependant ces trois syntaxes sont correctes :
template<typename T> void foo(const T& t){}
int main(){
// c-style cast
foo((unsigned char)0);
// without unsigned
foo(char(0));
// aliased unsigned char
typedef unsigned char uchar;
foo(uchar(0));
}
C'est donc l'espace dans la police qui est à blâmer ici.
J'ai pensé que ça pouvait être lié d'une manière ou d'une autre à notre vieil ami. l'analyse la plus contrariante J'ai donc essayé le syntaxe d'initialisation uniforme qui est censé se débarrasser de ce genre d'ambiguïtés, mais pas de chance :
template<typename T> void foo(const T& t){}
int main(){
foo(unsigned char{0});
}
Mais quand même :
-
error: expected primary-expression before ‘unsigned’
pour gcc. -
error: expected '(' for function-style cast or type construction
pour clang
Ma question est donc la suivante : pourquoi n'est-il pas permis d'avoir un type contenant un espace dans les casts de style fonction ? Cela ne me semble pas ambigu.
note : Je sais que je peux écrire foo<unsigned char>(0)
mais cela ne répond pas à la question ;)