前几天我遇到了一个bug,或多或少都出现了这个问题:
struct Foo {
Foo(T x) : x_(x) {}
T& x_;
};
int main() {
T x;
auto foo = Foo(x);
}
这很傻。构造Foo
时,其参数按值传递。构造完成后,参数可能会从堆栈中弹出,使Foo
对象留下对垃圾数据的引用。我的理解在这里可能是错的,但我认为这是有效的。
有没有理由这样做?我用GCC ARM编译器,专有的TI ARM编译器和MSVC编译了这段代码,但没有任何警告或错误。我不能为我的生活找到一个有意义的地方,但是当我不同意三个编译器时,我通常对自己没有多少信心。
我完全在这里吃午饭吗?是否有充分的理由这样做,如果没有,编译器是否有理由无法检测到这一点?