匿名对象的属性

时间:2018-12-03 23:27:59

标签: c++

说我有一个array_adder类,如果我创建此类的匿名对象和命名对象有什么区别? 范围会改变吗?

代码重载了标准+运算符:

template<typename LEFT, typename RIGHT>
array_adder<LEFT< RIGHT> operator+(LEFT& l, RIGHT& r){
return array_adder<LEFT,RIGHT>(l,r);

}

a + b将创建模板类array_adder的匿名对象。 匿名对象和命名对象之间有什么区别吗?

2 个答案:

答案 0 :(得分:1)

除了返回对上面引用的本地对象的引用的问题之外,在范围或其他方面没有任何区别。假设编译器能够正确解析您的LEFTRIGHT类型,则array_adder模板将被实例化为一个普通类,然后调用构造函数来创建该类的对象你回来了。

如果让函数按实例而不是引用返回,则可以在模板允许的情况下利用移动优化。

要注意的另一件事是,您使加法运算符对LEFTRIGHT对象进行非常量引用。在大多数情况下,我们希望普通的加法运算 not 不能修改其参数,因此有点违反直觉。

答案 1 :(得分:0)

在创建临时文件的完整表达式的末尾销毁临时对象(除非将引用绑定到该临时文件,在这种情况下,该临时文件的寿命将延长到引用的寿命。这不会发生)这里)。

返回的引用将引用在函数末尾被破坏的对象,并且使用所引用对象的行为(实际上不再是对象)是不确定的。据说这个参考是悬挂

目前还不清楚您所说的“ “如果我创建...一个命名对象就是区别” 。但是,如果您建议创建一个具有自动存储持续时间的局部变量,那么该变量也将在函数末尾销毁,并且返回的引用将悬空。

由于两个建议都只是返回一个悬挂的参考,因此任何进一步的比较都是没有意义的。

相关问题