说我有一个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的匿名对象。 匿名对象和命名对象之间有什么区别吗?
答案 0 :(得分:1)
除了返回对上面引用的本地对象的引用的问题之外,在范围或其他方面没有任何区别。假设编译器能够正确解析您的LEFT
和RIGHT
类型,则array_adder
模板将被实例化为一个普通类,然后调用构造函数来创建该类的对象你回来了。
如果让函数按实例而不是引用返回,则可以在模板允许的情况下利用移动优化。
要注意的另一件事是,您使加法运算符对LEFT
和RIGHT
对象进行非常量引用。在大多数情况下,我们希望普通的加法运算 not 不能修改其参数,因此有点违反直觉。
答案 1 :(得分:0)
在创建临时文件的完整表达式的末尾销毁临时对象(除非将引用绑定到该临时文件,在这种情况下,该临时文件的寿命将延长到引用的寿命。这不会发生)这里)。
返回的引用将引用在函数末尾被破坏的对象,并且使用所引用对象的行为(实际上不再是对象)是不确定的。据说这个参考是悬挂。
目前还不清楚您所说的“ “如果我创建...一个命名对象就是区别” 。但是,如果您建议创建一个具有自动存储持续时间的局部变量,那么该变量也将在函数末尾销毁,并且返回的引用将悬空。
由于两个建议都只是返回一个悬挂的参考,因此任何进一步的比较都是没有意义的。