5

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

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
4

1 回答 1

5

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

作为一个例子,让我们把Bufferintonamespace Noperator+into Buffer。如果a的类型是Wrapper<N::Buffer<5>>( 5rarher than -5),operator+被 ADL 找到,并且代码编译 ( live demo ):

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; }
于 2020-06-11T02:22:21.877 回答