0

std::string をラップするためのクラスが必要であり、他のすべての詳細に加えて、型キャスト演算子を使用して std::string への自動変換を提供するとします。

class MyWrappedString {
    std::string m_value;
    /* ... */
public:
    inline operator std::string() const {
        return m_value;
    }
};

そのため、オペレーターはラップされた文字列オブジェクトのコピーを返します。

しかし、なぜ次のコードは正しいように見えるのでしょうか?

MyWrappedString x;
const std::string& y = x;
// now, y should be a reference to a temporary, right?
std::cout << "y is: " << y << std::endl;

変換演算子は m_value の一時的なコピーを返すため、const std::string& y = xその一時的なコピーへの参照を作成します。

なぜこれが機能するのですか?参照されるオブジェクトの有効期間が延長されたのを覚えていますが、よくわかりません。

そして 2 番目の質問: const 参照を返す型キャスト演算子を使用することは可能ですか?

例えば:

inline operator const std::string &() const {
    return m_value;
}

では、上記のコードは一時コピーで動作する必要はありませんか?

PS: この質問は少し関連しています: Lifetime of temporariesですが、それでも別の問題です。

4

1 に答える 1

2

constconst参照がスコープ外になるまで、参照は参照を存続させます(通常はスコープ外になっている場合でも)

2番目の質問の場合:はい、const参照を返すことができ、関数からの戻り値をconst参照に割り当てる必要があります

于 2012-06-19T16:45:15.780 に答える