考虑类似于这样的东西:
#include <iostream>
struct C {
C(double x=0, double y=0): x(x) , y(y) {
std::cout << "C ctor " << x << " " <<y << " " << "\n";
}
double x, y;
};
struct B {
B(double x=0, double y=0): x(x), y(y) {}
double x, y;
};
struct A {
B b[12];
A() {
b[2] = B(2.5, 14);
b[4] = B(56.32,11.99);
}
};
int main() {
const B& b = A().b[4];
C c(b.x, b.y);
}
当我使用-O0编译时,我得到了打印输出
C ctor 56.32 11.99
但是当我使用-O2编译时,我遇到了
C ctor 0 0
我知道我们可以使用常量引用来延长本地临时变量的生命周期,所以类似以下的代码:
const A& a = A();
const B& b = a.b;
这是完全合法的,但我正在努力找出为什么同样的机制/规则不适用于任何类型的临时情况。
未来参考编辑:
我使用的是gcc版本6.3.0
[...]并且似乎工作正常[...]
这句话真的很误导,因为它暗示你认为它是有效的,只是因为它编译通过并且没有出现任何错误消息。这个问题不能通过测试是否编译通过来回答(除非你知道一个编译器的编译设置会精确地警告可能由于const ref引起的UB)。 - t.niese