c++ - 为什么 C++20 允许默认比较即使被删除也能编译?

标签 c++ equality c++20 defaulted-functions default-comparisons

考虑以下代码:

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

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

warning: explicitly defaulted equality comparison operator is implicitly deleted [-Wdefaulted-function-deleted] bool operator == (const B& other) const = default;

但我想知道为什么这个代码甚至被标准接受。 我假设如果有人在他的非模板结构/类中默认了 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;也可以删除成员函数。

关于c++ - 为什么 C++20 允许默认比较即使被删除也能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66051501/

相关文章:

c++ - 将重载函数传递给另一个函数时如何指定重载?

Visual Studio 中的 C++20 支持

c++ - 多个 tcp 套接字,一个停止

c++ - 如何在 C++ 中写入输入流 cin

c++ - 重载前模板实例化错误

c# - 什么是用于比较引用类型的两个实例的 "Best Practice"?

javascript - 有条件地隐藏类(class)

c++ - 来自 Lua 脚本的 nanosleep() 调用暂停了 QT GUI 线程

java - 使用文本文件中的数据作为 if 语句中的条件

c++ - 为什么 difference_type 是 std::weakly_incrementable 概念的一部分?