c++ - 是否可以更改临时对象并将其作为参数传递?

标签 c++ reference temporary const-reference

是否可以更改临时对象并将其作为参数传递?

struct Foo {    
   Foo& ref() { return *this; }
   Foo& operator--() { /*do something*/; return *this; }
   // another members
};
Foo getfoo() { return Foo(); } // return Foo() for example or something else
void func_val(Foo x) {}
void func_ref(const Foo & x) {}

int main() {
   func_val(--getfoo());     // #1 OK?
   func_ref(getfoo());       // #2 OK?
   func_ref(getfoo().ref()); // #3 OK?
   // the following line is a real example 
   //    using --vector.end() instead of --getfoo()
   func_ref(--getfoo());     // #4 OK? 

   const Foo & xref = --getfoo(); //  Does const extend the lifetime ?
   func_ref(xref);     // #5 OK? 
   func_val(xref);     // #6 OK? 

}

众所周知,将临时对象分配给 const 引用可延长此临时对象的生命周期。那么我的代码的#4 和#5 行呢? 引用 x 在函数 func_ref 中总是有效是真的吗? 问题是 operator-- 返回一些引用,而编译器看不到该引用与我们创建的临时对象之间的任何关系。

最佳答案

临时对象总是在创建它们的完整 表达式的生命周期内存在。因此,在表达式语句 func_val(--getfoo()); 中,getfoo() 表达式返回的临时对象的生命周期不会不需要任何延期。该语句直到 func_val() 返回后才结束。

关于c++ - 是否可以更改临时对象并将其作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1571731/

相关文章:

c++ - 功能模板的部分属性在 GCC 中被静默忽略

c++ - 从文件中流式传输数字

mysql select from table 1 join and order by table 2 优化文件排序

c++ - 在 VS 中更改常量 char* 文字的元素

reference - 为什么我可以返回对局部文字的引用而不是变量?

javascript - 转到 Web Essentials 中的定义

c# - 将自定义路径设置为引用的 DLL?

phpqrcode - 将文件保存到临时目录

c++ - 通过引用使用临时对象和 args 的规则

c++ - 如何将对象移动到 std::async()?