c++ - 为什么 C++20 允许默认比较即使被删除也可以编译?
问题描述
考虑以下代码:
struct A {
};
struct B {
A a;
bool operator == (const B& other) const = default;
};
clang 给出了一个很好的警告:
警告:显式默认的相等比较运算符被隐式删除 [-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++ 从 GCC 扩展模拟 __typeof__ ?
- ffmpeg - 为什么 FFMpeg 输出错误的 NAL 单元类型?(javascript h264 直播)
- javascript - AngularJS - 将 $factory 注入控制器
- arrays - 启动一个 numpy.array 并附加/连接没有成功
- oracle - 尝试在 Oracle 中创建临时表
- javascript - 如何更改照片中文字的颜色?
- mysql - MySQL:使用 IN(...) 的索引强制使用不同的 access_type
- php - 连续的 Ajax 查询返回旧信息
- javascript - 如何使用 javascript 在本地存储中存储多个复选框值?
- python - Groupby 使用 Django ORM