1

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

#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;
}

布莱尔

4

1 回答 1

6

std::forward是一个模板,如果你想让它正常工作,你需要显式地提供类型参数。这就是你的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

于 2013-02-11T13:31:58.593 回答