我收到以下代码的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;
}
布莱尔
答案 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
,则类型推导失败的原因。