Почему VS 2008 компилируется без предупреждения с ошибочной логикой шаблона? - PullRequest
1 голос
/ 06 января 2012

У меня есть простой пример шаблона, который выглядит следующим образом:

template<class T> class A {
   friend int f(T);
}

int main(){
   A<int> a;
   return 0;
}

Этот код компилируется и выполняется без предупреждения в VS2008 (за исключением неиспользуемой переменной). Я считаю, что должна быть проблема, так как мы получаем много версий не шаблонной функции в одном классе только с одним определением. Я что-то пропустил?

Ответы [ 2 ]

1 голос
/ 06 января 2012

Почему этот код должен выдавать ошибку?Для каждого T, с которым вы создаете экземпляр A, будет объявлена ​​и добавлена ​​новая функция.Никогда не будет двух одинаковых функций, так как вы не можете дважды создать экземпляр шаблона для одного и того же типа (вы просто повторно используете старый экземпляр).

Кроме того, даже если бы было так или иначе возможно сгенерировать два равных объявления, не было бы никакой двусмысленности, так как функции сначала объявляются внутри класса.Как таковые, они никогда не могут быть найдены ничем, кроме поиска, зависящего от аргумента.(По сути, эти функции бесполезны, так как их нельзя вызвать)

§7.3.1.2 [namespace.memdef] p3

[...] Если объявление friend в нелокальном классе сначала объявляет классили функция. Другим классом или функцией является член внутреннего пространства имен. Имя друга не найдено ни в неквалифицированном поиске, ни в квалифицированном поиске, пока не будет предоставлено соответствующее объявление в этой области пространства имен (ни до, ни после определения класса, предоставляющего дружбу).[...]

Также, посмотрите это .

1 голос
/ 06 января 2012

Согласно стандарту C ++, степень проверки синтаксиса для неиспользуемых шаблонных функций зависит от реализации.Компилятор не выполняет никакой семантической проверки - например, символы не ищутся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...