用户定义的转换运算符模板和内置运算符:不匹配运算符

rus*_*tyx 9 c++ language-lawyer c++11

考虑以下MCVE.

#include <type_traits>

struct A {
    template<typename T, typename std::enable_if<std::is_same<T,int>::value,int>::type = 0>
    operator T() const { return static_cast<T>(1); }
};

int main() {
    int x = 1;
    A a;
    return x + a;
}
Run Code Online (Sandbox Code Playgroud)

clang汇编得很好.DEMO

海湾合作委员会失败了:

error: no match for 'operator+' (operand types are 'int' and 'A')
  return x + a;
         ~~^~~
Run Code Online (Sandbox Code Playgroud)

问题:谁是对的?为什么?

Bar*_*rry 5

我相信铿锵是对的.

要进行查找+,因为至少有一个参数具有类类型,我们会考虑成员,非成员和内置候选.没有任何会员或非会员候选人,所以这已经足够了.有一个内置候选人int operator+(int, int),这是唯一的候选人.那个候选人是可行的,因为A可转换为int直接(我们从一个标准转换Aconst A&了隐式对象参数,然后从用户定义的转换int,就没有必要再转换).由于我们有一个可行的候选人,这使得它成为最有可行的候选人.


请注意,如果A只是operator int() const { return 1; },gcc会接受它.这只是转换函数模板,无法考虑.