为什么临时对象在表达式结束后仍然存在
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;
)。
为什么
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;
)。