这段代码在什么条件下是正确的:
struct A {
A(B b) : b_(b) {}
private:
const B& b_;
}
B b_permanent;
A a(b_permanent);
IIUC,b
将是b_permanent
的副本,b_
将绑定到该副本。但是b
的生命周期是多少?如果它只是在ctor的持续时间内,那么这是错误的,因为b_
将在ctor完成时绑定到超出范围的对象。如果是这样的话,为什么它在C ++中甚至是合法的,甚至不会引起lint警告?
OTOH,如果b
生命周期延长到等于a
的生命周期,那么你可以将我链接到一个规则吗?
答案取决于B
是基本类型还是复合类型?
答案是否取决于C ++ 11 vs 14 vs 17? (我对11之前的任何事情都不感兴趣。)
答案 0 :(得分:5)
非静态成员b_
具有封闭对象的生命周期。对象b
具有自动存储持续时间,因为它是一个函数参数,并且在构造函数返回时会被销毁。所以b_
确实成为了那时的悬空参考。
编写这样的代码是 legal ,因为检测此类代码是一个实施质量问题。虽然在这种情况下很明显代码是错误的,但引用绑定可能涉及更复杂的逻辑来确定引用绑定到哪个对象。编译器无法在所有情况下检测 这是否正在发生。如果您希望工具链能够捕获 easy 这样的案例,请提交功能请求。