【发布时间】:2010-09-02 22:12:22
【问题描述】:
考虑这段代码:
template <int N>
struct X
{
friend void f(X *) {}
};
int main()
{
f((X<0> *)0); // Error?
}
编译器似乎非常不同意。 (MSVC08/10 说不,GCC
根据“C++ 模板 - 完整指南”:
...假设调用 涉及查找朋友 关联的类实际上导致 要实例化的类......虽然 这显然是那些 写了 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> 注入的可行函数在X<0> 的ADL 期间是否应该可见?它们有关联吗?上面提到的所有编译器都接受这个代码,除了 Comeau,它只在宽松模式下接受它。也不确定标准对此有何规定。
您对此有何看法?
【问题讨论】:
标签: c++ templates friend-function argument-dependent-lookup