【问题标题】:Safe to store moved object in member reference?将移动的对象存储在成员引用中是否安全?
【发布时间】:2016-07-11 23:01:44
【问题描述】:

以下代码是否安全,或者在构造 Cm_s 可能是一个悬空引用?

class C {
public:
    C(string&& s) : m_s{s} {} 
private:
    string& m_s;
};

【问题讨论】:

    标签: c++ c++11 reference move-semantics


    【解决方案1】:

    不,这不安全,请考虑以下示例:

    C c(std::string("42"));
    

    你在构造函数中传递一个临时的。这样您就可以创建一个悬空引用。

    【讨论】:

    • m_s 设为const string& 会使其安全吗?我知道在引用和 const 引用方面存在不同的生命周期延长规则。
    • @Danra 不,它不会。即使 const 合格,它仍将是一个悬空引用。
    • 出于好奇,是否存在原始代码不会创建悬空引用的情况?
    • @Danra std::string s; C c(std::move(s)); 不会是一个悬空引用,因为 sc 寿命长。但是人们不希望你坚持右值引用。他们希望你马上和他们做点什么。
    【解决方案2】:

    不,这不安全。此外,成员 const 引用不会延长临时对象的生命周期(因此这也不是一个选项)。相反,您应该做的是从您的临时变量中构造一个值以将其“吸收”到您的类中:

    class C {
    public:
        C(string&& s) : m_s{std::move(s)} {} 
    private:
        string m_s;
    };
    

    【讨论】:

      猜你喜欢
      • 2015-11-02
      • 2010-12-19
      • 2013-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多