为什么c++ 20允许默认的比较即使被删除也可以编译?



考虑以下代码:

struct A {
};
struct B {
A a;
bool operator == (const B& other) const = default;
};

clang给出了一个很好的警告:

警告:显式默认的相等比较操作符是隐式删除[- wdefault -function-deleted]bool操作符== (const B&

但是我想知道为什么这个代码甚至被标准所接受。我假设如果有人在他的非模板结构/类中默认了operator ==,他的意图是而不是删除operator ==

但是这是c++,有无数的极端情况,所以可能有一个很好的理由。也许不是特例模板?

但是clang足够聪明,可以而不是警告此代码…

struct A {
};
template<typename T>
struct TS{
T t;
bool operator == (const TS& other) const = default;
};
int main() {
TS<int> ti;
}

…所以理论上标准也可以这么做。

在模板中,如果==可以存在,您可能需要它,否则不需要。

复制/移动/赋值特殊成员函数也使用同样的技术;=default;也可以删除成员函数

最新更新