C++ 当constexpr

C++ 当constexpr,c++,gcc,operators,c++20,constexpr,C++,Gcc,Operators,C++20,Constexpr,我正在测试C++20的新功能,以自动生成比较运算符,我发现了一个奇怪的情况,即默认运算符似乎给出了错误的结果 它仅在使用gcc时发生,并且仅当运算符声明为constepr时发生 以下代码: #include <iostream> struct Foo { int foo; constexpr bool operator==(const Foo&) const = default; }; struct Bar : public Foo { const

我正在测试C++20的新功能,以自动生成比较运算符,我发现了一个奇怪的情况,即默认运算符似乎给出了错误的结果

它仅在使用
gcc
时发生,并且仅当运算符声明为
constepr
时发生

以下代码:

#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;
}
但是当使用
clang
编译时,会给出:

Foo:{5}==={0}=>false
条:{5}==={0}=>false
编译器资源管理器链接:


我假设这是
gcc
中的一个bug,但我不知道该语言的所有怪癖,所以我决定在报告它之前在这里提问。

是的,编写的代码应该可以工作,所以这是一个gcc bug。默认的
操作符==
需要对所有子对象进行相等比较,而不仅仅是成员子对象


从中可以看出,GCC 11.1为
Bar
生成了与无子对象的结构相同的比较运算符代码。

GCC repo trunk版本与每个有意义的产品的trunk版本非常类似。大多数人(除了gcc的开发人员)都没有使用它,所以不太可能得到答案,为什么特定的输入会产生如此奇怪的输出。那么我的建议是停止使用任何预期有缺陷的产品版本。无论你如何快速、高效和/或以多么现代的方式从这类软件中得到错误的答案。@ÖTiib:“而且整个gcc 11在stackoverflow和其他任何地方都多次被报告有缺陷。”这与此无关。一旦你不再谈论主干,一旦你在处理一个实际发布的版本,你的初始点(主干应该是有缺陷的,所以你不应该在它上面测试代码)就变得无关紧要了。指责某人行为不诚实,因为他们谈论的是发行版中存在的问题,这是非常明显的。从好的方面来看,这里完全不需要添加
constexpr
关键字(默认的比较是隐式的
constexpr
),因此解决您的bug的简单方法就是。。。不提供关键字。@ÖöTiib您没有时间单击编译器资源管理器链接中的下拉菜单,但您有时间写多条贬低gcc状态的注释?也许重新考虑一下你的优先事项。我会在Bugzilla上报道,但我看到@Barry已经这么做了。谢谢