Вдохновленный кодом в этом ответе. Рассмотрим:
template<class>
class A { };
int main()
{
A<float> a(A<float>::A<int>());
return 0;
}
Этот код
- плохо сформирован, потому что
A<float>::A
называет конструктор (в §3.4.3.1 [class.qual]/p2) и не может быть использован в этом контексте (плюс<int>
завершается, чтобы не разбираться в любом случае), или - корректно, при этом
A<float>::A
является именем введенного класса, используемым в качестве имени шаблона (§14.6.1 [temp.local]), так чтоA<float>::A<int>
означает точно такое же, какA<int>
, иa
объявляется как функция (из-за самого досадного разбора)?
g++ говорит 1. clang говорит 2, и поэтому ICC 13. Какой компилятор прав?