c++ - 从按值构造函数参数初始化的引用成员

标签 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_ 将绑定(bind)到该拷贝。但是 b 的生命周期是多少?如果它只是在 ctor 的持续时间内,那么这是错误的,因为 b_ 将在 ctor 完成时绑定(bind)到范围外的对象。如果是这样,为什么它甚至在 C++ 中也是合法的,甚至不会引起 lint 警告?

OTOH,如果 b 的生命周期延长到等于 a 的生命周期,那么您能否将我链接到说明该情况的规则?

答案是否取决于 B 是基本类型还是复合类型?

答案是否取决于 C++ 11 vs 14 vs 17? (我对 11 点之前的任何事情都不感兴趣。)

最佳答案

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

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

关于c++ - 从按值构造函数参数初始化的引用成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46921500/

相关文章:

c++ - 如何获取模板模板参数的模板参数?

c++ - 我应该分配还是重置一个 unique_ptr?

c++指向整数的指针在减去时给出不同的答案

c++ - 右值引用和左值引用作为参数的区别

c++ - 是否可以在没有父窗口的主窗口中使用 WA_DeleteOnClose 属性?

c++ - Win32 API 文本输入

c++ - 对指向 const char 的非常量指针的非常量引用

c++ - 为什么我需要在 move 构造函数的初始化列表中使用 std::move?

c++ - 如何根据空格删除字符串

Java Observable/Observer 与仅传递引用