【发布时间】:2016-07-11 23:01:44
【问题描述】:
以下代码是否安全,或者在构造 C 后 m_s 可能是一个悬空引用?
class C {
public:
C(string&& s) : m_s{s} {}
private:
string& m_s;
};
【问题讨论】:
标签: c++ c++11 reference move-semantics
以下代码是否安全,或者在构造 C 后 m_s 可能是一个悬空引用?
class C {
public:
C(string&& s) : m_s{s} {}
private:
string& m_s;
};
【问题讨论】:
标签: c++ c++11 reference move-semantics
不,这不安全,请考虑以下示例:
C c(std::string("42"));
你在构造函数中传递一个临时的。这样您就可以创建一个悬空引用。
【讨论】:
m_s 设为const string& 会使其安全吗?我知道在引用和 const 引用方面存在不同的生命周期延长规则。
std::string s; C c(std::move(s)); 不会是一个悬空引用,因为 s 比 c 寿命长。但是人们不希望你坚持右值引用。他们希望你马上和他们做点什么。
不,这不安全。此外,成员 const 引用不会延长临时对象的生命周期(因此这也不是一个选项)。相反,您应该做的是从您的临时变量中构造一个值以将其“吸收”到您的类中:
class C {
public:
C(string&& s) : m_s{std::move(s)} {}
private:
string m_s;
};
【讨论】: