【发布时间】:2018-02-02 15:36:37
【问题描述】:
在 AIX 上使用 xlC 编译以下代码会生成打印“2 2”的代码。在带有 gcc 和 clang 的 Linux 上,它可靠地产生“3 3”。
#include <iostream>
struct Numbers
{
Numbers() : a(0) , b(0) { }
Numbers(int a, int b) : a(a), b(b) { }
int a;
int b;
};
Numbers combine(const Numbers& a, const Numbers& b)
{
Numbers x;
x.a = a.a + b.a;
x.b = a.b + b.b;
return x;
}
Numbers make()
{
Numbers a(1, 1);
Numbers b(2, 2);
a = combine(a, b);
return a;
}
int main()
{
Numbers a = make();
std::cerr << a.a << " " << a.b << "\n";
}
在我看来,AIX 正在将 RVO 应用于 combine 的返回值,所以当我创建 Numbers x 时,它最终会用默认初始化的 x 覆盖我的参数 a。
我在这里调用了一些未定义的行为吗?我希望在combine(a, b) 被评估并分配给a 之前,不会对a 进行任何修改。
这是与: 适用于 AIX 的 IBM XL C/C++,V12.1(5765-J02、5725-C72) 版本:12.01.0000.0012
【问题讨论】:
-
我在这里看不到 UB。似乎是编译器错误。
-
如果将
std::cerr << a.a << " " << a.b << "\n";添加到make()中会发生什么? -
你试过直接
return combine(a, b);吗? -
那么肯定看起来像一个错误。
-
@Hamish Morrison 当他们回复您的错误报告时,请在此处发布结果。无论他们确认还是否认这是一个错误,回复对于未来看到此问题的用户来说都是有用的信息。
标签: c++ language-lawyer c++03