inf*_*ged 1 c++ reference temporary-objects
我正在学习本教程 - http://www.learncpp.com/cpp-tutorial/132-function-template-instances/
// passing all parameters by references
template <typename T1, typename T2>
const T2& add_two_objects(const T1& x,const T2& y) {
return x+y;
};
int main() {
using std::cout;
int x(0),y(0);
std::cout << "Please enter number 1" << std::endl;
std::cin >> x;
std::cout << "Please enter number 2" << std::endl;
std::cin >> y;
cout<< "sum of two integers is " << add_two_objects(x,y+1.2) << '\n';
cout<< "sum of two double is " << add_two_objects(x,y+2.52424324) << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
程序编译得很好,但在运行时,我总是遇到分段错误.但是,如果我将模板更改为按值传递,则一切正常.
// passing all parameters by value
template <typename T1, typename T2>
const T2 add_two_objects(const T1 x,const T2 y) {
return x+y;
};
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
这个
template <typename T1, typename T2>
const T2& add_two_objects(const T1& x, const T2& y) {
return x+y;
};
Run Code Online (Sandbox Code Playgroud)
返回对临时的引用.使返回值为
template <typename T1, typename T2>
T2 add_two_objects(const T1& x, const T2& y) {
return x+y;
};
Run Code Online (Sandbox Code Playgroud)
你应该没事
顺便说一句,目前还不清楚返回a T2是最好的事情.考虑例如案例T1=size_t和T2=char.最好返回操作x+y实际生成的类型
template <typename T1, typename T2>
auto add_two_objects(const T1& x, const T2& y)
-> decltype(x+y)
{
return x+y;
};
Run Code Online (Sandbox Code Playgroud)
- - - 编辑 - - -
您不得返回对临时对象的引用.这是一个BUG.如果你想要一个bug,那就去吧.你不应该使用糟糕的教程.在某些情况下,您希望/应该返回引用,但这不是其中之一.这些是当引用函数返回时不会被销毁(或超出范围)的对象(如所有自动和临时变量那样).