4

我有一个看起来像这样的程序:

class B {};

class A 
{
    template<typename T> int operator+(const T&) const { return 1; } // Function 1
};

template<typename T, typename P> int operator+(const T&, const P&) { return 2; } // Function 2

int main()
{
    A a;
    B b;
    
    std::cout<<(a + b);

    return 0;
}

在这种情况下,函数 2 将被调用。但是当我将函数 1 修改为自由函数而不是成员函数时

template<typename T> int operator+(const A&, const T&) { return 1; } // Function 1
template<typename T, typename P> int operator+(const T&, const P&) { return 2; } // Function 2

现在将调用函数 1,即使在这两种情况下函数 1 基本相同。这背后的原因是什么?GCC 根据 ISO C++ 标准抱怨歧义,但没有说明确切的原因并且无论如何编译都很好。这种情况对于操作员来说是独一无二的,因为无论他们是否是成员,它们都可以以相同的方式被调用。

4

1 回答 1

2

现在将调用函数 1,即使在这两种情况下函数 1 基本相同。这背后的原因是什么?

执行重载函数模板的部分排序以在此处选择最佳匹配。

非正式地,“A 比 B 更专业”的意思是“A 接受的类型比 B 少”。

函数 1 比函数 2 更专业,因为它接受的类型更少;它只能接受A第一个操作数,而函数 2 可以接受任何类型。

出于同样的原因,在第一种情况下,也应选择成员函数 1;就像铿锵一样。这似乎是 gcc 的错误,请参阅Bug 53499Bug 66914

于 2020-08-17T06:52:24.750 回答