完美的转发没有拿起方法

时间:2013-02-11 13:29:12

标签: c++ templates c++11 rvalue-reference perfect-forwarding

我收到以下代码的SFINAE错误,因为它不会使用该模板。我试图完善前进的结果。任何人的想法。

#include <iostream>

#include "constants.h"


namespace perfectforwarding
{
    template<class T, class U>
    constexpr auto maximum(T&& a, U&& b) -> decltype( (a > b) ? std::forward(a) : std::forward(b))
    {
        return (a > b) ? std::forward(a) : std::forward(b);
    }
}



int main(int argc, const char * argv[])
{

    std::cout << "Created count is: " << created_count << std::endl;

    auto const result = perfectforwarding::maximum(5,6.0);

    std::cout << "The maximum of 5 and 6: " << result << std::endl;
    return 0;
}

布莱尔

1 个答案:

答案 0 :(得分:6)

std::forward是一个模板,如果您希望它正常工作,则需要明确提供type参数。这就是你的maximum函数模板应该被重写的方式:

template<class T, class U>
constexpr auto maximum(T&& a, U&& b) -> 
    decltype( (a > b) ? std::forward<T>(a) : std::forward<U>(b))
{
    return (a > b) ? std::forward<T>(a) : std::forward<U>(b);
}

这是std::forward实用程序的定义方式:

template<class T> 
T&& forward(typename remove_reference<T>::type& a) noexcept
{
    return static_cast<S&&>(a);
}

表达式typename remove_reference<T>::type使这成为非推导的上下文,这解释了如果您没有明确提供类型参数T,则类型推导失败的原因。