为什么临时对象在表达式结束后仍然存在

Why is temporary object living after end of the expression

为什么

string getString(){
    return string("string");
}

int main(){
const string& a = getString();
    cout << a;
}

会给一个UB

这个:

class vector{
void push_back(const T& value){
        //...
        new(arr + sz) T (value);
        ++sz;

    }
}

main(){
vector v;
v.push_back(string("abc"));
}

会好吗?

我想在第一种情况下临时对象会在表达式结束后立即过期 const string& a = getString(); 而在第二种情况下临时对象的生命将延长到函数完成。 一个表达式后面的临时对象生命周期延长是唯一一个吗

案例一:

I guess that in first case temporary object expires right after end of the expression const string& a = getString();

请注意,

const references are allowed to bind to temporaries. Also, const references extend the lifetime of those temporaries.

例如,

const int &myRef = 5;

此处引用 myRef 延长了使用 prvalue 表达式 5 实现的临时 int 的生命周期 temporary实体化.

与您的第一个代码片段类似,函数 getString() returns a std::string by value。在这种情况下具体化的临时对象的生命周期也会延长。

所以你的第一个代码片段没有 UB。

你问了

Is it the only one case of prolonging of temporary object's life behind of an expression.

没有像我给出的例子那样的例子(const int &myRef = 5;)。