从按值构造函数参数

时间:2017-10-24 23:25:10

标签: c++ c++11 reference initialization c++14

这段代码在什么条件下是正确的:

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之前的任何事情都不感兴趣。)

1 个答案:

答案 0 :(得分:5)

非静态成员b_具有封闭对象的生命周期。对象b具有自动存储持续时间,因为它是一个函数参数,并且在构造函数返回时会被销毁。所以b_确实成为了那时的悬空参考。

编写这样的代码是 legal ,因为检测此类代码是一个实施质量问题。虽然在这种情况下很明显代码是错误的,但引用绑定可能涉及更复杂的逻辑来确定引用绑定到哪个对象。编译器无法在所有情况下检测 这是否正在发生。如果您希望工具链能够捕获 easy 这样的案例,请提交功能请求。