通过const&;由康斯特返回; 在C++中,当你有以下内容: std::string get_string(); std::string const& v = get_string(); std::string const& get_string(std::string const& p) { return p; } std::string const& v = get_string(std::string{"Hello"});
从get_string()返回的临时变量的生存期延长到与引用v相同的生存期 如果我有以下资料:通过const&;由康斯特返回; 在C++中,当你有以下内容: std::string get_string(); std::string const& v = get_string(); std::string const& get_string(std::string const& p) { return p; } std::string const& v = get_string(std::string{"Hello"});,c++,reference,lifetime,C++,Reference,Lifetime,从get_string()返回的临时变量的生存期延长到与引用v相同的生存期 如果我有以下资料: std::string get_string(); std::string const& v = get_string(); std::string const& get_string(std::string const& p) { return p; } std::string const& v = get_string(std::string{"Hello
std::string get_string();
std::string const& v = get_string();
std::string const& get_string(std::string const& p) {
return p;
}
std::string const& v =
get_string(std::string{"Hello"});
临时工的寿命是否延长?或者这是一个悬而未决的参考
我的理解是,暂时性的必然是p的一生
这只在函数的持续时间内存在,对临时函数的二次引用不会延长生存期
预期的结果是什么?是的,临时文件的寿命不会进一步延长;在完整表达式之后,引用
v
变为悬空
std::string const& v = get_string(std::string{"Hello"});
// v becomes dangled now
我的理解是,临时变量与p的生存期有关,并且只在函数的持续时间内存在
确切地说,函数存在到完整表达式结束,而不仅仅是函数的持续时间
- 在包含该函数调用的完整表达式结束之前,函数调用中引用参数的临时绑定一直存在:如果函数返回的引用超过完整表达式,则它将成为悬空引用
这意味着类似于
auto sz=get_string(std::string{“Hello”}).size()的东西
很好。之所以如此,是因为它绑定到p,并且在参数列表中,并且在调用结束时的for不能扩展到v。“那么v是悬挂的是吗?”BlairDavidson我认为这种思维方式是正确的;我在回答中添加了一些引语。奇怪的是,这在gcc中有效,所以我有点困惑。@BlairDavidson对悬挂引用的取消引用导致UB;一切皆有可能。完整表达式是赋值运算符的右侧=还是赋值运算符的左侧和右侧?这似乎是旧表达式的更好版本