带有运算符语法的错误消息,但不是带有函数语法的错误消息

Dr.*_*Gut 6 c++ templates

为什么在+使用运算符语法调用一元时会收到错误消息?如果我用函数语法调用它,就可以了。现场演示

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)

Dav*_*ing 5

非限定查找调用ADL,它需要知道关联类中是否定义了友元函数。 Buffer<-5>就是这样,所以它被实例化了。语法上很明显它声明没有朋友这一事实并没有改变以下事实:相同的检查涉及完成类类型,但失败了。

举个例子,让我们把Buffer进入namespace Noperator+进入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)