gpt4 book ai didi

c++ - 没有运算符 ==() 的类的对象被转换为另一种类型

转载 作者:可可西里 更新时间:2023-11-01 17:53:07 24 4
gpt4 key购买 nike

为什么类 A 的对象在以下代码中被转换为 bool(或 int):

class A
{
public:

operator bool() const { return true; }
operator int() const { return 1; }
};

int main()
{
return A() == A();
}

并且不清楚它们转换成什么? bool 型还是整数型?

最佳答案

我们需要找到如何处理==。这将涉及为 == 寻找成员、非成员和内置候选项。在这种情况下,我们没有任何成员(member)/非成员(member)候选人,所以这部分很简单。

内置候选项来自 [over.built]/13 (强调我的,并删节):

For every pair of promoted arithmetic types L and R, there exist candidate operator functions of the form

bool operator==(L, R);

promoted arithmetic types是提升后的整数类型和浮点类型。任何小于 int 的整数类型(包括 bool)promotesint。 (float promotesdouble,但 float 仍然是“提升的算术类型”)。这对我们来说很重要的部分确实是“提升的算术类型”包括 int,但不包括 bool。如此有效,我们有内置的候选人,如:

bool operator==(int, int);
bool operator==(int, long);
bool operator==(long, int);
bool operator==(long, long);
bool operator==(int, float);
// etc.

这组中有很多候选者。但我们基本上可以将它们分为两组。

第一组完全由:

bool operator==(int, int);

这个候选是可行的,我们有一个明确的最佳转换顺序,因为通过 operator int() const 比通过 operator bool() const 然后提升更好.

第二组由所有其他候选人组成。对于不是 int 的每个提升的算术类型,我们有两个等效的转换序列:一个通过 bool 转换,一个通过 int 转换。两者都不比另一个好。当我第一次写这个答案时,我认为这意味着这些候选人会被拒绝——但令人惊讶的是,事实并非如此,因为 T.C.指出:一个不明确的转换序列是 treated equivalently to任何其他用户定义的转换序列。

所以从第一组中,我们有一个可行的候选者,它涉及一个用户定义的转换序列。在第二组中,我们有很多转换序列不明确的候选 - 重要的是,它们被认为与第一组中的 operator==(int, int) 候选一样好。

因此,A() == A() 格式错误。没有最佳可行的候选人。 gcc 接受这个是错误的。


请注意,gcc 确实拒绝了具有相同想法的非常相似的其他介绍:

void check(int, int);
void check(float, float);

check(A(), A()); // gcc and clang reject, msvc accepts

关于c++ - 没有运算符 ==() 的类的对象被转换为另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54600009/

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