5

このコードは有効ですか?

int foo()
{
    std::vector<std::string>& v = std::vector<std::string>(5, "X");

    // Do something silly...

    return 42;
}

何らかの理由で、一時std::vectorオブジェクト(代入記号から右) は、構築直後に破棄する必要があると考えました(したがって、参照が無効になります)

しかし、デバッグは私が間違っていることを証明し、関数が戻るときに一時変数が破棄される理由がよくわからないことに気付きました。


基本的なことを強く誤解していると思うので、教えてください:)

4

3 に答える 3

8

あなたが示したコードは違法です – 一時変数は右辺値参照またはconst左辺値参照にのみバインドできます。

VC++ ではたまたま拡張機能として許可されています (そのため、レベル 4 の警告が表示されます)。

于 2012-05-10T18:34:29.570 に答える
3

一時的なものの通常の存続期間は、それが作成された完全な式の終わりまでです。使用時にすぐに破壊されるとは限りません。一時的なものを使用して参照を初期化する場合、その存続期間は参照の存続期間と一致するように延長されます(コンストラクターの初期化子リストに作成された一時的なものを除く)。

もちろん、あなたのコードは違法です。非定数への参照の場合、ある種の左辺値でのみ初期化できます。ただし、それが合法である場合(および、少なくとも1つのコンパイラーがそれを受け入れる場合)、参照の有効期間と一致するように有効期間を延長する必要があります。

于 2012-05-10T18:56:33.997 に答える
2

割り当て解除されたオブジェクトへの参照があります。これは「完全な運」によって機能します ( The C++ Programming Languageのセクション 10.4.10 一時オブジェクトを参照してください)。すべてのコンパイラで動作することを保証することはできません。

参照にバインドされている場合にのみ、一時の有効期間が延長されることを確認できconstます。

于 2012-05-10T18:42:22.813 に答える