Рассмотрим этот код:
template <int N>
struct X
{
friend void f(X *) {}
};
int main()
{
f((X<0> *)0); // Error?
}
компиляторы, похоже, сильно не согласны.(MSVC08 / 10 говорит «нет», GCC <4.5 говорит «да», но 4.5 говорит «нет», вс 5.1 говорит «да», Intel 11.1 тоже говорит «да», но Comeau говорит «нет» (оба EDG)).- Полное руководство ": </p>
... предполагается, что вызов, включающий поиск друзей в ассоциированных классах, фактически приводит к созданию экземпляра класса ... Хотя это было явно предназначено теми, ктонаписал стандарт C ++, он не четко прописан в стандарте.
Я не смог найти соответствующий раздел в стандарте.Любая ссылка?
Рассмотрите этот вариант:
template <int N>
struct X
{
template <int M>
friend void f(X<M> *) {}
};
template <>
struct X<0>
{
};
int main()
{
X<1>();
f((X<0> *)0); // Error?
}
Ключевой вопрос здесь заключается в том, должна ли жизнеспособная функция, введенная X<1>
, быть видимой во время ADL для X<0>
?Они связаны?Все компиляторы, упомянутые выше, принимают этот код, кроме Comeau, который принимает его только в расслабленном режиме.Не уверен, что стандарт говорит об этом.
Что вы думаете об этом?