考虑以下代码:ADL和朋友注射
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))。
据“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>
注入ADL为X<0>
过程中应该是可见的可行函数?他们有联系吗?上面提到的所有编译器都接受这个代码,Comeau只在轻松模式下接受。不知道该标准对此有何评论。
你对此有何看法?
第一个例子应该是可编译的吗? – jpalecek 2010-09-02 22:48:20
谢谢:)这或多或少是我怀疑的。那么多编译器如何得到第二个错误的错误?另外,如果您也可以为其他引用的标准提供参考,我会认真的。 – uj2 2010-09-02 22:48:58
@ uj2好了,至少clang与GCC相比看起来不错。它正确地拒绝了第二种情况。特别是海湾合作委员会有相当多的模板一致性问题,所以这并不令我感到意外。你试图找到哪些其他引号标准段落? – 2010-09-02 22:53:51