C++ 何时在模板定义中衰减

标签 c++ templates c++17

我试图更好地理解什么时候衰变或不是一种类型

#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/

相关文章:

c++ - OpenCV 视频捕捉

c++ - 与 min_element 和 max_element 一起使用 minmax_element 是否有任何效率优势?

c++ - 纯虚最终函数 : legal in C++11

c++ - 代理类模板具有与表示类相同的构造函数签名

c++ - 使 C++ 类成为监视器(在并发意义上)

c++ - 为什么允许 std::optional 与值进行比较?

c++ - 为什么 main() 必须返回一个 int?

c++ - 什么时候可以安全地重复使用来自普通可破坏对象的内存而不洗

c++ - 使用 boost metaparse 字符串解析包含的文件

c++ - 有没有一种方法可以将可变参数包中的所有类指定为模板的友元,以便使用 operator=?