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

mkshixfv  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(167)

请考虑以下代码:

#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;
}

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

c = 0
A.b = 2

我希望c是2。有人能解释为什么它是0吗?

icomxhvb

icomxhvb1#

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

  • 使用c++ 11和14在gcc 6.* 上按预期工作
  • 使用c++14在gcc 7.、8.、9.1-4上失败
  • 用c++11编写gcc 7.,8.,9.* 的程序
  • 使用c++14在gcc 9.5上工作
  • 在gcc 10上使用c++ 11和14工作

我用-O3编译,用-O0测试了 * 一些 *,优化级别在我测试的地方没有什么不同。
我不确定在哪里可以找到bug票证。Here's a link to the change summary for GCC 9 versionsHere's a link to the bugzilla tickets resolved by 9.5。我没有看到任何看起来完全匹配的内容。可能是我错过了它,或者票证没有被放在列表中(更改摘要页提到了一种可能性)。
此列表可能不完整(也就是说,某些已修复的PR可能未在此处列出)。

相关问题