通过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"});

通过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

从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"});
临时工的寿命是否延长?或者这是一个悬而未决的参考

我的理解是,暂时性的必然是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;一切皆有可能。完整表达式是赋值运算符的右侧=还是赋值运算符的左侧和右侧?这似乎是旧表达式的更好版本