我试图更好地理解什么时候衰变或不是一种类型
#include <type_traits>
template <typename T1, typename T2> auto max_test(T1 a, T2 b) -> typename std::decay<decltype(a > b ? a: b)>::type {
return a < b ? a : b;
}
template <typename T1, typename T2> auto max_test_r(T1 a, T2 b) -> decltype(a > b ? a: b) {
return a < b ? a : b;
}
哪个是最正确的版本,为什么?我应该避免使用衰减还是应该何时使用它们?
第二个如果有缺陷,感谢 Adam 的回答。问题是您正在 decltyping 一个左值。
最佳答案
如果 a 和 b 是相同的字面量类型,则您的 decay-less 返回一个悬空引用。
你的衰减器没有。
会有无数其他不太重要的差异,但这个错误非常大。
Decay 做特定的事情。什么时候应该使用它是什么时候您希望这些事情发生,或者当您有一个类型需要将其拷贝存储为值时。
关于C++ 何时在模板定义中衰减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69594601/