将移动的对象存储在成员引用中安全吗?
Safe to store moved object in member reference?
下面的代码是否安全,或者 m_s
在构造 C
后可能是悬空引用?
class C {
public:
C(string&& s) : m_s{s} {}
private:
string& m_s;
};
不,这不安全,请考虑以下示例:
C c(std::string("42"));
你在构造函数中传递一个临时的。这样你就创建了一个悬空引用。
不,这不安全。此外,成员 const 引用不会延长临时对象的生命周期(因此这也不是一个选项)。相反,您应该做的是从您的 "absorb" 临时构造一个值,然后将其移入 class :
class C {
public:
C(string&& s) : m_s{std::move(s)} {}
private:
string m_s;
};
下面的代码是否安全,或者 m_s
在构造 C
后可能是悬空引用?
class C {
public:
C(string&& s) : m_s{s} {}
private:
string& m_s;
};
不,这不安全,请考虑以下示例:
C c(std::string("42"));
你在构造函数中传递一个临时的。这样你就创建了一个悬空引用。
不,这不安全。此外,成员 const 引用不会延长临时对象的生命周期(因此这也不是一个选项)。相反,您应该做的是从您的 "absorb" 临时构造一个值,然后将其移入 class :
class C {
public:
C(string&& s) : m_s{std::move(s)} {}
private:
string m_s;
};