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 >。但是,在 method 上Game::doSomething(),我将返回值放在了一个 const std::vector< std::string > &-type 对象中。

这是不安全的,还是像这样使用它们完全正常?AFAIK,临时变量在其范围结束时被销毁。但是在我们的例子中,我们引用了这个临时变量,我相信它在返回值后会被销毁。

重写其他方法是否更好,以便它使用返回值的副本而不是引用?

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 回答