以下のコードは安全ですか、を作成した後にm_s
が手掛かりになる可能性がありますか?移動したオブジェクトをメンバー参照に保存するのは安全ですか?
C c(std::string("42"));
あなたは一時的なコンストラクタで渡す:
class C {
public:
C(string&& s) : m_s{s} {}
private:
string& m_s;
};
以下のコードは安全ですか、を作成した後にm_s
が手掛かりになる可能性がありますか?移動したオブジェクトをメンバー参照に保存するのは安全ですか?
C c(std::string("42"));
あなたは一時的なコンストラクタで渡す:
class C {
public:
C(string&& s) : m_s{s} {}
private:
string& m_s;
};
はありません、それは安全ではありませんが、次の例を考えてみましょう。こうすると、ぶら下がっている参照が作成されます。
いいえ、安全ではありません。また、メンバのconst参照は一時的なライフタイムを延長しません(オプションでもありません)。代わりにあなたがするべきことは一時的なものから値を構成して、それをあなたのクラスに "吸収する"ことです:
class C {
public:
C(string&& s) : m_s{std::move(s)} {}
private:
string m_s;
};
'm_s'を' const string& 'にすると安全でしょうか?私は、参照とconst参照が関係する、異なる生涯の拡張規則があることを知っています。 – Danra
@ダナラじゃないでしょうか。たとえconst修飾されていても、ぶら下がっている参照であり続けるでしょう。 – 101010
好奇心の席から、元のコードがぶら下がっている参照を作成しない*という状況はありますか? – Danra