为什么我在调用单利的 +
用运算符语法?如果我用函数语法调用它,就可以了。现场演示.
template <int size>
struct Buffer { char buf[size]; };
template <class T>
struct Wrapper { void operator+() {} };
Wrapper<Buffer<-5>> a;
void f1() { +a; } // error: Buffer<-5>::buf has negative size
void f2() { a.operator+(); } // OK
非限定查找调用了 ADL,它需要知道在关联的类中是否有任何定义的朋友函数。 Buffer<-5>
就是这样的一个,所以它被实例化了。 语法上很明显,它没有声明任何友函数,但这并不能改变这样一个事实,即对相同的检查涉及到完成类的类型,而这是失败的。
作为一个例子,让我们把 Buffer
变成 namespace N
和 operator+
变成 Buffer
. 如果 a
的类型是 Wrapper<N::Buffer<5>>
(5
稀罕 -5
), operator+
是由ADL找到的,代码编译后(现场演示):
template <class T>
struct Wrapper {};
namespace N {
template <int size>
struct Buffer {
template <class T> friend void operator+(const Wrapper<T>&) {}
char buf[size];
};
}
Wrapper<N::Buffer<5>> a;
void f1() { return +a; }