gpt4 book ai didi

c++ - 自定义转换算子模板和内置算子 : no match for operator

转载 作者:可可西里 更新时间:2023-11-01 16:39:47 26 4
gpt4 key购买 nike

考虑以下 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;
}

clang 可以很好地编译它。 DEMO

但是 GCC 失败了:

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

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

最佳答案

我相信 clang 是对的。

要在 + 上查找,因为至少有一个参数有类类型,我们考虑 member, non-member, and builtin candidates .没有任何成员(member)或非成员(member)候选人,所以这就足够了。有一个内置候选 int operator+(int, int) ,这是唯一的候选人。那个候选人是可行的,因为A可以转换为 int ,直接(对于隐式对象参数,我们有一个从 Aconst A& 的标准转换,然后是用户定义的从那个到 int 的转换,不需要进一步的转换)。由于我们有一个可行的候选者,这很容易使其成为最佳可行的候选者。


请注意,如果 A刚刚operator int() const { return 1; } , gcc 会接受它。只是转换函数template没有考虑到。

关于c++ - 自定义转换算子模板和内置算子 : no match for operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49653048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com