将移动的对象存储在成员引用中安全吗?

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;
};