返回临时对象并使用其引用

时间:2013-09-08 12:41:34

标签: c++

假设我有这种方法可以创建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 > & - 类型对象中。

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

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

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

    // Do something about names
}

2 个答案:

答案 0 :(得分:1)

按值返回向量是完全安全的。当您将其分配给const引用时,编译器将Database :: getRecordNames()返回的临时值保持活动状态,直到引用所在范围的末尾。这就是定义const引用的绑定属性的方式。

答案 1 :(得分:0)

只要您返回按值而不是按引用它是完全安全的。只要引用在范围内,C ++编译器就会为您保留临时对象。