C++11 使用右值引用重载

C++11 使用右值引用重载,c++11,rvalue-reference,C++11,Rvalue Reference,完美的转发是伟大的。但是,如果我不想完全转发,而只是在某个模板类型上重载,我该怎么办呢 template<typename T> void foo(T&& ref); template<typename T> void foo(const T& ref); 模板无效foo(T&&ref); 模板无效foo(常数T&ref); 无法工作,因为第一个重载将调用完美转发。如果第一个是正常的左值引用,我真的希望它的行为与之非常相似,其中T将始终是一个

完美的转发是伟大的。但是,如果我不想完全转发,而只是在某个模板类型上重载,我该怎么办呢

template<typename T> void foo(T&& ref);
template<typename T> void foo(const T& ref); 
模板无效foo(T&&ref);
模板无效foo(常数T&ref);
无法工作,因为第一个重载将调用完美转发。如果第一个是正常的左值引用,我真的希望它的行为与之非常相似,其中T将始终是一个值类型。

\include
#include <type_traits>

template<typename T>
typename std::enable_if
<
    !std::is_reference<T>::value,
    void
>::type
foo(T&& ref) {}

template<typename T> void foo(const T& ref) {}
模板 typename std::启用\u如果 < !std::is_reference::value, 无效的 >::类型 foo(T&&ref){} 模板void foo(const T&ref){}
我从来没有想过SFINAE解决方案,因为MSVC的支持太差了。谢谢:)我不知道如果您将enable_if从返回类型移动到参数列表,支持是否更好?