如何声明对经历模板参数推导的类型的右值引用?

时间:2016-01-08 14:09:35

标签: c++ c++11 reference

template <typename T> void foo(T&& t);    // universal reference
template <typename T> void bar(T& t);     // lvalue reference

那么我们如何声明对未知类型的严格右值引用呢?

1 个答案:

答案 0 :(得分:4)

如果将T推断为左值,则可以选择使用SFINAE禁用该功能:

#include <type_traits>

template <typename T>
auto foo(T&& t)
    -> typename std::enable_if<!std::is_lvalue_reference<T>::value>::type
{
}

DEMO

如果T&&产生左值参考,则启用:

#include <type_traits>

template <typename T>
auto foo(T&& t)
    -> typename std::enable_if<std::is_rvalue_reference<T&&>::value>::type
{
}

DEMO 2