Conversão no estilo do construtor em parâmetros de chamada de função

Não entendo por que o código a seguir falha ao compilar ao usar a conversão no estilo do construtor:

template<typename T> void foo(const T& t){}

int main(){
  foo(unsigned char(0));
}

Os erros são:

error: expected primary-expression before ‘unsigned’ para o gcc.error: expected '(' for function-style cast or type construction para clang

No entanto, essas três sintaxes estão corretas:

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));
}

Portanto, o espaço no tipo é obviamente o culpado aqui.

Eu pensei que poderia estar de alguma forma relacionado ao nosso velho amigoa análise mais irritante, então eu tentei osintaxe de inicialização uniforme, que deveria se livrar desse tipo de ambiguidade, mas sem sorte:

template<typename T> void foo(const T& t){}

int main(){
  foo(unsigned char{0});
}

Mas ainda:

error: expected primary-expression before ‘unsigned’ para o gcc.error: expected '(' for function-style cast or type construction para clang

Portanto, minha pergunta é: por que não é permitido ter um tipo que contenha um espaço nas conversões no estilo de função? Não me parece ambíguo.

Nota: Eu sei que sei escreverfoo<unsigned char>(0), mas não responde à pergunta;)

questionAnswers(1)

yourAnswerToTheQuestion