功能模板按值和参考差异

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)

有人可以解释一下吗?

Wal*_*ter 6

这个

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_tT2=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,那就去吧.你不应该使用糟糕的教程.在某些情况下,您希望/应该返回引用,但这不是其中之一.这些是当引用函数返回时不会被销毁(或超出范围)的对象(如所有自动和临时变量那样).