在函数返回的临时对象上调用成员函数是否安全(函数返回后)?

use*_*066 1 c++

当临时对象由(另一个)函数创建然后返回时,我不知道调用临时对象的成员函数是否安全.

以下是一个例子:

string getString(const string &str)
{
    string tempStr = str + str;

    return tempStr;
}

int main()
{
    if(getString("aaaaa").compare("bbbb") == 0) { // is it safe?
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

我也做了如下的终身测试.

class Foo
{
public:
    Foo()
    {
        cout << __PRETTY_FUNCTION__ << " :" << this << endl;
    }

    ~Foo()
    {
        cout << __PRETTY_FUNCTION__ << " :" << this << endl;
    }

    void show()
    {
        cout << this << endl;
    }
};

Foo func(void)
{
    return Foo();
}

int main()
{
   func().show();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

Foo :: Foo():0x7fff4d03d3bf
void Foo :: show():0x7fff4d03d3bf
Foo :: ~Foo():0x7fff4d03d3bf

似乎析构函数将在成员函数完成后启动.但它取决于编译器吗?

PS:我使用的编译器是g ++ v 5.3.1谢谢

Dav*_*rtz 9

由按函数返回对象的函数的return语句创建的临时对象至少存在,直到调用该函数的整个语句完成为止.所以这是安全的.

tempStr由于返回值优化,您没有看到被破坏.但是,即使tempStr被破坏,代码仍然是100%安全的,因为您访问的临时文件不是 tempStr由值返回创建的临时文件.