加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:24:55 所属栏目:百科 来源:网络整理
导读:是否可以更改临时对象并将其作为参数传递? struct Foo { Foo ref() { return *this; } Foo operator--() { /*do something*/; return *this; } // another members};Foo getfoo() { return Foo(); } // return Foo() for example or something elsevoid fun
是否可以更改临时对象并将其作为参数传递?

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());     // #1 OK?

好的. operator–是一个成员函数,它被调用,并返回自身(和左值引用自身).然后将该对象复制到func_val的参数中.请注意,不允许应用返回值优化,因为getfoo()创建的临时值先前已绑定到引用.

func_ref(getfoo());       // #2 OK?

好的.调用getfoo()返回绑定到const引用的临时值.需要一个复制构造函数,但是它的调用可能会被实现优化掉.临时持续到包含对func_ref(此处为整个表达式语句)的调用的完整表达式结束.

func_ref(getfoo().ref());

好的.不需要复制构造函数,因为我们将const引用绑定到临时,而不是绑定到表示对象本身的左值.

// the following line is a real example 
//    using --vector.end() instead of --getfoo()

这不是必须的.想想vector.end()返回T *(允许)的情况.您不能修改非类型的rvalues,因此在这种情况下,这将是不正确的.

func_ref(--getfoo());

好的.参数在#1中进行求值,但是直接传递得到的左值并且const参考绑定到它.在这个意义上它等于#3(除了减量副作用).

const Foo & xref = --getfoo();

标准措辞并不完全清楚.它肯定只是为了延长尚未绑定到引用的对象的生命周期.但在我们的例子中,– getfoo()产生一个左值,引用一个先前绑定到引用的临时对象.可能值得向委员会提交缺陷报告(我可能也错过了要求临时对象不受限制参考的措辞).

在任何情况下,预期的行为是在初始化外部参照时破坏getfoo()产生的临时行为,因此外部参照将成为悬空引用.

The thing is that operator– returns some reference and the compiler does not see any relation between this reference and the temporary we created.

确切地说(但仅适用于xref的初始化,它会发疯.在所有其他情况下,实现你想要的(或我认为你想要的)行为).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读