C++返回临时对象的混乱

DeX*_*eX3 8 c++ temporary-objects

我有一个相当基本的C++问题,考虑一个函数,它接受一些输入参数并std::string从这些参数中创建一个,如下所示:

std::string constructString( int some_parameter ) {

    std::stringstream ss;

    // Construct a string (arbitrarily complex)
    ss << "Some parameter is " << some_parameter << " right now";

    return ss.str();    //Am I not returning a temporary object here?
}
Run Code Online (Sandbox Code Playgroud)

我知道stringstream-object在函数返回时会超出范围,但是不会使构造的字符串失效吗?

如果我将返回类型更改为const char *并返回,会发生什么ss.str().c_str()

像上面这样的代码似乎有效,但我怀疑这只是因为当我使用它时,包含'临时'对象的内存还没有被其他东西覆盖?

我不得不承认,在这种情况下我总是很困惑,如果有人可以向我解释这整个"临时对象"(或者只是指向正确的方向),我会很感激.

thx提前

Pau*_*aul 13

您正在返回一个临时对象,但由于您按值返回该对象,因此会创建该副本.如果返回临时对象的指针或引用,那将是一个错误.

如果你将返回类型更改为const char *并返回ss.str().c_str(),则会返回指向某个临时std::string返回的缓冲区的指针ss.str(),这样会很糟糕.


Den*_*lin 5

正如你看到的Stringstream::str()返回std::string对象。您std::string没有引用就返回,这意味着没有 RVO(NRVO) 优化复制构造函数将调用并创建有效std::string对象。随着优化std::string将在没有复制构造函数的情况下移动。但是如果会返回std::string&它会崩溃,因为这个对象会在函数返回后被销毁。相同的效果将与const char *因为销毁此指针后将指向坏内存,这是危险的情况。