如何解决当 constexpr
我正在测试 C++20 的新特性以自动生成比较运算符,但我发现了一个奇怪的情况,即默认运算符似乎给出了错误的结果。
它只发生在 gcc
并且仅当运算符被声明为 constexpr
时。
以下代码:
#include <iostream>
struct Foo
{
int foo;
constexpr bool operator==(const Foo&) const = default;
};
struct Bar : public Foo
{
constexpr bool operator==(const Bar&) const = default;
};
int main()
{
const Foo foo0{5};
const Foo foo1{0};
std::cout << "Foo: {" << foo0.foo << "} == {" << foo1.foo << "} => " << ((foo0 == foo1) ? "true" : "false") << std::endl;
const Bar bar0{5};
const Bar bar1{0};
std::cout << "Bar: {" << bar0.foo << "} == {" << bar1.foo << "} => " << ((bar0 == bar1) ? "true" : "false") << std::endl;
return 0;
}
当用 gcc
编译时给出:
Foo: {5} == {0} => false
Bar: {5} == {0} => true
但是当用 clang
编译时给出:
Foo: {5} == {0} => false
Bar: {5} == {0} => false
编译器资源管理器链接:https://godbolt.org/z/vbzo35an5
我假设这是 gcc
中的一个错误,但我不了解该语言的所有怪癖,所以我决定在报告之前先在这里询问。
解决方法
是的,编写的代码应该可以工作,所以这是一个 GCC 错误。默认 operator==
预期对所有子对象进行相等比较,而不仅仅是成员子对象。
您可以从 the assembly output 中看到,GCC 11.1 为 Bar
生成的比较运算符代码与为没有子对象的结构生成的比较运算符代码相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。