为什么 C++ 中的临时结构成员没有预期的值?

nie*_*sen 9 c++ gcc

考虑这段代码:

#include<iostream>

struct A
{
    int b;
};

int main()
{
    int c = (A() = A{2}).b;  // Why is c zero after this?
    std::cout << "c = " << c << std::endl;
    std::cout << "A.b = " << (A() = A{2}).b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这是打印相同值的两种等效方法,但我得到了这个结果(在 MinGW 下的 GCC 7.3.0 上):

c = 0
A.b = 2
Run Code Online (Sandbox Code Playgroud)

我本来期望c是2。谁能解释为什么它是0?

小智 1

正如@StoryTeller-UnslanderMonica 提到的,这是一个 GCC 错误。我在 godbolt.com 上测试了几个版本。这是我发现的:

  • 在带有 c++ 11 和 14 的 gcc 6.* 上按预期工作
  • 使用 c++14 在 gcc 7.*、8.*、9.1-4 上失败
  • 适用于 gcc 7.*、8.*、9.* 和 c++11
  • 适用于 gcc 9.5 和 c++14
  • 适用于 gcc 10 以及 c++ 11 和 14

我用 进行了编译-O3,并用进行了一些-O0测试,优化级别在我测试的地方没有产生影响。

我不知道在哪里可以找到错误票。这是 GCC 9 版本的更改摘要的链接这是 9.5 解决的 bugzilla 票证的链接。我没有看到任何看起来完全匹配的东西。要么我错过了,要么票没有被放入该列表中(更改摘要页面提到了这种可能性)。

此列表可能不完整(即,某些已修复的 PR 可能未在此列出)。