函数的生存期扩展,通过const&接受参数并通过const&返回

时间:2019-05-16 10:29:52

标签: c++ reference lifetime

在C ++中,当您具有以下条件时:

select id, col_a, col_b, col_c from tablename;

id  | col_a              | col_b          | col_c
------------------------------------------|---------
1   | apple orange plum  | red green blue | bill dave sue
2   | orange plum banana | yellow red     | frank james
3   | kiwi fruit apple   | green pink     | bill sarah-jane frank

expected_result: ["apple", "orange", "banana", "fruit", 
                  "green", "yellow", "frank", "james", "sarah-jane"]

从get_string()返回的临时变量的生存期延长到与引用v相同的生存期;

如果我具有以下条件:

std::string get_string();
std::string const& v = get_string();

临时期限是否延长了?或者这是一个悬而未决的参考文献;

我的理解是临时绑定到p的生存期 并且仅在函数运行期间存在,并且对临时目录的辅助引用不会延长生存期。

预期结果是什么?

1 个答案:

答案 0 :(得分:1)

是的,临时文件的寿命不会再延长;在完整表达式之后,引用v会晃晃。

std::string const& v = get_string(std::string{"Hello"});
// v becomes dangled now
  

我的理解是,临时绑定到p的生存期,并且仅在函数的持续时间内存在

准确地说,temporary一直存在到完整表达式的结尾,而不仅仅是函数的持续时间。

  
      
  • 在函数调用中包含引用参数的临时绑定一直存在,直到包含该函数调用的完整表达式的末尾为止:如果函数返回的引用超出了完整表达式的使用寿命,则它将变为悬空引用。
  •   
     

通常,不能通过“将其传递”来进一步延长临时项的生存期:从临时项绑定到的引用初始化的第二个引用不会影响其生存期。

这意味着可以使用auto sz = get_string(std::string{"Hello"}).size();之类的东西。