Я не понимаю, почему следующий код не удается скомпилировать при использовании конструкторского стиля:
template<typename T> void foo(const T& t){}
int main(){
foo(unsigned char(0));
}
Ошибки:
-
error: expected primary-expression before ‘unsigned’
для gcc. -
error: expected '(' for function-style cast or type construction
для clang
Однако эти три синтаксиса верны:
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));
}
Таким образом, здесь очевидно, что здесь висит пространство в типе.
Я думал, что это может быть как-то связано с нашим старым другом самым неприятным анализом, поэтому я попробовал синтаксис синтаксиса , который должен избавиться от такого рода двусмысленностей, но не повезло:
template<typename T> void foo(const T& t){}
int main(){
foo(unsigned char{0});
}
Но все же:
-
error: expected primary-expression before ‘unsigned’
для gcc. -
error: expected '(' for function-style cast or type construction
для clang
Итак, мой вопрос в том, почему не разрешено иметь тип, содержащий пробел в стилевом стиле? Это не выглядит двусмысленным для меня.
note: Я знаю, что могу написать foo<unsigned char>(0)
, но он не отвечает на вопрос;)