c++ - 使用 decltype 作为尾随返回类型的正确方法

标签 c++ templates c++11 decltype perfect-forwarding

我经常看到这种形式的例子:

template <typename T, typename U>
auto add(T&& t, U&& u) -> decltype(std::forward<T>(t) + std::forward<U>(u))
{
    return std::forward<T>(t) + std::forward<U>(u);
}  

但我敢说这是更好更正确的方法:

template <typename T, typename U>
auto add(T&& t, U&& u) -> decltype(t + u)//no forwarding here
{
    return std::forward<T>(t) + std::forward<U>(u);
}

为什么?首先,此示例中的 decltype 仅需推导返回类型,因此 (t + u) 不是 (std::forward(t) + std::forward(u)) 的返回类型,由两个 ver 生成的第二个代码是identical,第三个 decltype(u + t) 更直接,准确表达了程序员的意图,而没有带出实现的“胆量”。

你对这个问题有什么看法?

最佳答案

第一个版本更正确,因为它与函数体将要返回的内容完全匹配。正如已经指出的那样,根本无法保证

decltype(std::forward<T>(t) + std::forward<U>(u))

将是同一类型

decltype(t + u)

可以说,这是一个极端情况,但“正确”的方法是使用 std::forward。

关于c++ - 使用 decltype 作为尾随返回类型的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5802266/

相关文章:

c++ - numeric_limits 是最小/最大常数吗?

c++ - 删除函数签名类型的成员性? (lambda 的运算符())

c++ - 具有模板化类型的动态类型单例。这是一种可行的方法吗? [提供的解决方案]

C++ 将内部枚举用于类模板

java - 生成报告 - 什么对您有用?

c++ - 与 Clang 和 Boost 1.48 一起工作的多播委托(delegate)/信号库?

c++ - 使用 std::result_of<F> 时模板推导失败

c++ - intel-pin:如何将命令行参数传递给二进制文件

c++ - 泛化一个函数

c++ - 保留一个 reference_wrapper 对象的 vector ,这怎么可能?