gpt4 book ai didi

C++20 显式默认相等运算符

转载 作者:行者123 更新时间:2023-12-01 12:47:11 25 4
gpt4 key购买 nike

我试图了解 C++20 中引入的新默认比较运算符。我的问题是关于何时隐式定义显式默认的比较运算符。下面的代码示例说明了这个问题:

#include <iostream>

struct B
{
operator bool() const { return true; }
};

struct D : B
{
bool operator==(const D&) const = default;
};

bool operator==(B, B) { return false; }

int main ()
{ D d;
std::cout << (d == d);
}

/* Outputs:
0 in gcc 10.1
1 in msvc 19.26
*/
该程序的输出依赖于编译器。似乎 MSVC 在遇到默认声明时为类 D 定义了 operator==,因此它不使用稍后为类 B 定义的 operator==。相比之下,gcc 等待 D 的隐式定义operator== 直到实际需要它,此时为 B 定义的 operator== 在范围内,并被使用。哪种行为(如果有)是正确的?
一个相关的问题是,为什么不能为具有引用成员的类声明默认的 operator== ?我可以看到引用成员可能会对 MSVC 方法造成问题,因为当遇到 operator== 的默认声明时,引用成员可能会引用不完整的类型。使用 gcc 方法,在 gcc 尝试定义默认运算符之前,引用的类型将始终是完整的。

最佳答案

GCC 在这里是错误的(考虑到它的结果并不奇怪)。创建默认比较运算符的定义时,the standard says :

Name lookups in the defaulted definition of a comparison operator function are performed from a context equivalent to its function-body.


以及默认函数的函数体 is where = default is .因此, bool operator==(B, B)函数不应对默认比较运算符的函数体可见。

关于C++20 显式默认相等运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62954994/

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