为什么在+使用运算符语法调用一元时会收到错误消息?如果我用函数语法调用它,就可以了。现场演示。
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
Run Code Online (Sandbox Code Playgroud)
非限定查找调用ADL,它需要知道关联类中是否定义了友元函数。 Buffer<-5>就是这样,所以它被实例化了。语法上很明显它声明没有朋友这一事实并没有改变以下事实:相同的检查涉及完成类类型,但失败了。
举个例子,让我们把Buffer进入namespace N和operator+进入Buffer。Ifa的类型为Wrapper<N::Buffer<5>>( 5rarher than -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; }
Run Code Online (Sandbox Code Playgroud)