操作符语法的错误信息,但不是函数语法的错误信息。

问题描述 投票:7回答:1

为什么我在调用单利的 + 用运算符语法?如果我用函数语法调用它,就可以了。现场演示.

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
c++ templates
1个回答
5
投票

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

作为一个例子,让我们把 Buffer 变成 namespace Noperator+ 变成 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; }
© www.soinside.com 2019 - 2024. All rights reserved.