вложу почтовый копию возможного ДР недавно я послал на Рождество здесь
хорошо ли сформирован следующий код?
template<typename T>
struct A {
A<T>();
};
Несколько компиляторы, которые я тестировал (лязг, г ++ и Комео conline) принять это. Действительно 12,1 не запрещает этого (A<T>
этого имя этого класса и не имя ЬурейеГо), но 8.3p1 говорит
Безусловный-идентификатор происходящий в описателе-идентификаторе должен быть простым идентификатором, за исключением для объявления некоторых специальных функций (12.3, 12.4 , 13,5) ...
конструктор представляет собой специальную функцию член, но список перекрестных ссылок не включает в себя 12.1. Означает ли это, что приведенный выше код плохо сформирован? Или это случайное упущение?
Если вы сделаете то же самое в определении вне линии, вы попытаетесь передать аргументы шаблона конструктору. Это правильный код
struct A {
template<typename T> A();
};
template<> A::A<int>() { }
Спецификация говорит, что, когда вводится имя класса используется в квалифицированном имени при поиске в области видимости класса (так же, как и в A::A
), а затем, когда поиск имени принимает функции/имена конструктора , ссылка на введенное имя класса будет переведена для разрешения на конструктор (ы) этого класса (если контекст поиска имени принимает только типы, то имя останется именем введенного класса и будет обозначать тип класса). После A::A
поиск по имени завершен и дает конструктор. Затем <int>
может быть проанализирован только как список аргументов шаблона. Если среди ваших конструкторов нет шаблона, ваш код будет недействительным.
FWIW, строит и работает на GCC 4.6.1 тоже. – Mat
Предположительно из-за 12.1/1: «Синтаксис использует ... имя класса конструктора ...», этот вопрос равен «is» Foo 'имя класса?" –
@SteveJessop: ... ", и если да, то почему это не принято в определении?" –