为什么是暂时的对象活在表达结束之后



如果

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

我猜在第一种情况下,临时对象在表达式const字符串结束后立即过期;a=getString((;

注意,

const引用被允许绑定到临时库。此外,const引用延长了这些临时性的使用寿命。

例如,

const int &myRef = 5;

这里,由于临时物化,参考myRef延长了使用prvalue表达式5物化的临时int的寿命。

类似地,在您的第一个代码片段中,函数getString()通过值返回一个std::string。在这种情况下,临时材料的使用寿命也将延长。

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

你问

这是表达式后面唯一一个延长临时对象寿命的情况吗。

没有其他例子,比如我给出的例子(const int &myRef = 5;(。

最新更新