1

C++ ではconst、一時的なものへの参照を使用することが有効です。

const std::string& s = std::string("abc");
std::cout << s.length() << std::endl; // valid because string instance is still alive

しかし、一時が別の型からの変換によって作成された場合、これは当てはまりますか?

例えば:

struct Foo
{ 
    ~Foo()
    {
        cout << "Foo destructor?" << endl;
    }
};

struct Bar
{ 
    operator Foo()
    {
        return Foo();
    }

    ~Bar()
    {
        cout << "Destructor" << endl;
    }
};

Foo getFoo()
{
    return Foo();
}

Bar getBar()
{
    return Bar();
}

int main()
{
    const Foo& f = getBar();
        /* is f valid here, or is it a dangling reference? */
    std::cout << "We're still in main!" << std::endl;
}

Bar のデストラクタが出力の前に 呼び出されることに注意してください。私は正しいですか?We're still in mainFoo& f

4

2 に答える 2

2

関数getBarは型のオブジェクトを作成し、すぐに破棄してそのコピーBarを返します。

Bar getBar()
{
    return Bar();//the lifetime of Bar() is only on this line;
}

編集:

ソース コード内の質問については、const Foo & f有効な場合。はいgetBar、オブジェクトのコピーを返すためです。また、コードを確認した後、最初に Bar のコピーを返し、次にそれをキャストすることがわかりますFoo

また、コンパイラからの最適化である RVO (コメント セクションから) について言及する必要があります。オブジェクトの有効期間はそのスコープによって定義されます{}が、この場合、構築は関数内で行われ、破棄は関数外で行われます。この最適化は、次のように変数に名前を付けると機能しません。

Bar getBar()
{
    Bar tmp_value;
    return tmp_value;
}

ラズヴァン。

于 2013-10-29T18:35:41.353 に答える