C++ 传递临时堆栈对象作为对函数的引用

标签 c++ function pointers reference

template<class D>
class Animal{
public:
    D a;
    Animal(){
        a=0;
    }
};
template<class D>
Animal<D>& addAnimal(Animal<D>& ans, const Animal<D>& a, const Animal<D>& b){
    ans.a = a.a + b.a;
    return ans;
}

//an overloaded simpler method for the one above
template<class D>
Animal<D> addAnimal(const Animal<D>& a, const Animal<D>& b){
    return addAnimal( Animal<D>(),a,b);
}
int main() {    
    Animal<int> a;
    Animal<int> b;
    Animal<int> c = addAnimal(a,b);
}

以下不编译。为什么不?我知道我可以通过按值传递 ans 参数或通过以下方式更改对该方法的调用来解决此问题:

template<class D>
Animal<D> addAnimal(const Animal<D>& a, const Animal<D>& b){
    Animal<D> ans;
    return addAnimal(ans,a,b);
}

我想更好地理解按引用传递以及如何调用堆栈对象的默认构造函数。 谢谢!

最佳答案

线

return addAnimal( Animal<D>(),a,b);

不起作用,因为 Animal<D>()是一个临时对象,不能在需要非 const 的函数调用中使用左值引用。

更重要的是,我不清楚为什么你需要重载

template<class D>
Animal<D>& addAnimal(Animal<D>& ans, const Animal<D>& a, const Animal<D>& b) { ... }

您可以实现更简单的两个参数函数:

template<class D>
Animal<D> addAnimal(const Animal<D>& a, const Animal<D>& b){
   Animal<D> ans;
   ans.a = a.a + b.b;
   return ans;
}

并完全摆脱另一个。

关于C++ 传递临时堆栈对象作为对函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58946654/

相关文章:

c++ - 使用 system() 运行两个可执行文件

c++ - 将左 const 添加到指针数组

jquery - 运行从另一个函数调用的 jQuery 函数

c++ - 指向类对象和初始化成员值的指针数组

在 C 中从 char * 转换为 char[31]

c++ - QProgressDialog 没有关闭按钮

c++ - 未声明的结构名称和交换函数在没有通过引用传递的情况下进行交换

oracle - 您如何获得 Oracle 中的最大可能日期?

c - 将数组指针传递给 C 中的函数

c++ - shared_ptr 空指针和赋值