下面的程序可以编译(参见 godbolt ),但如果我们取消注释 Buffer
的定义,它就不会编译。 .
template <int size>
struct Buffer /*{ char buf[size]; }*/;
template <class T>
struct Wrapper { void operator+() {} };
Wrapper<Buffer<-5>> a;
void f() { +a; }
原因,未注释的版本无法编译:+a
触发 ADL,并收集 operator+
的所有候选人,必须检查所有关联类的 friend
职能。 Buffer<-5>
是一个关联类,所以它必须被实例化。实例化失败,因此编译错误。参见 this question .
我想知道 Buffer<-5>
必须实例化,为什么我们没有编译错误,如果 Buffer
没有定义?
最佳答案
您可以(隐式地)仅从一个声明中实例化一个类模板;你得到一个不完整的类类型,就像 struct A;
( [temp.inst]/2 ) 一样。当然,使用不完整的关联类进行 ADL 并不是错误;有问题的类根本不会搜索友元声明。
关于c++ - 未定义的类模板未实例化以检查友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62351110/