c ++模板中的段错误

xGe*_*tox 7 c++ templates

我有一个关于C++模板的问题.以下代码段错误.

template <typename T1, typename T2>
inline T1 const& max(T1 const &a, T2 const &b) {
    return a < b ? b : a;
}
int main() {
    std::cout << max(4.9, 4) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,删除&它会做正确的事情.

template<typename T1, typename T2>
inline T1 const max(T1 const &a, T2 const &b) {
    return a < b ? b : a;
}
int main() {
    std::cout << max(4.9, 4) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

此外,只需使用T代替T1和T2,它就可以正常工作.

template<typename T>
inline T const& max(T const &a, T const &b) {
    return a < b ? b : a;
} 

int main() {
    std::cout << max(4, 5) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

Cur*_*ous 10

您应始终在打开警告的情况下进行编译,请参阅https://wandbox.org/permlink/KkhFOJw6QNJ7rv7J.如果你有警告标志,编译器会帮助你,并告诉你你做错了什么.

这里发生的是一个促销(参见'?:'(三元条件运算符)的返回类型),你正在a int和a 上执行一个三元表达式double.这样做会导致临时晋升double.并返回对临时的引用并在其生命周期绑定返回的函数之后引用它是未定义的行为.