0

タイプのオブジェクトを作成するこのメソッドがあるとしますstd::vector< std::string >

const std::vector< std::string > Database::getRecordNames() {
    // Get the number of recors
    int size = this -> getRecordCount();

    // Create container
    std::vector< std::string > names;

    // Get some strings
    for ( i = 0; i < size; i++ ) {
        // Get a string
        const std::string & name = this -> getName( i );

        // Add to container
        names.push_back( name );
    }

    // Return the names
    return names;
}

そして、別の場所で、この方法を使用します

void Game::doSomething() {
    const std::vector< std::string > & names = mDatabase -> getRecordNames();

    // Do something about names
}

したがって、メソッドDatabase::getRecordNames()では、一時オブジェクトが返されますstd::vector< std::string >。ただし、メソッドGame::doSomething()では、戻り値を const std::vector< std::string > &型オブジェクトに配置しました。

これは安全ではありませんか、それともこのように使用するのは完全に正常ですか? 私の知る限り、一時変数はスコープの最後で破棄されます。しかし、私たちの場合、この一時変数を参照します。値を返した後に破棄されると思います。

参照の代わりに戻り値のコピーを使用するように、他のメソッドを書き直したほうがよいでしょうか?

void Game::doSomething() {
    const std::vector< std::string > names = mDatabase -> getRecordNames();

    // Do something about names
}
4

2 に答える 2

1

ベクトルを値で返すことは完全に安全です。これを const 参照に割り当てると、コンパイラは Database::getRecordNames() によって返された一時を、参照が存在するスコープの終わりまで有効に保ちます。これが、const 参照のバインド プロパティが機能するように定義されている方法です。

于 2013-09-08T12:48:45.610 に答える
0

参照ではなく値で返す限り、完全に安全です。C++ コンパイラは、参照がスコープ内にある限り、一時オブジェクトを存続させます。

于 2013-09-08T12:45:27.470 に答える