如何编写模板函数接受&&和const&both?

use*_*020 3 c++ templates move-semantics c++11

例如

template<typename T> void f(T&& t) {}
template<typename T> void f(T const& t) {}
Run Code Online (Sandbox Code Playgroud)

我打电话的时候

int i;
f(i); // call f(T&&) which I expect to call f(T const&), how to solve it?
f(10); // call f(T&&), that is fine
Run Code Online (Sandbox Code Playgroud)

jro*_*rok 7

这是一种方式:

#include <type_traits>

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

template<typename T> void f(T const& t) {}
Run Code Online (Sandbox Code Playgroud)

标签调度的另一种可能性是:

template<typename T>
void f_(const T&, std::true_type) { std::cout << "const T&\n"; }
template<typename T>
void f_(T&&, std::false_type) { std::cout << "T&&\n"; }

template<typename T>
void f(T&& t)
{
    f_(std::forward<T>(t), std::is_lvalue_reference<T>{} );
}
Run Code Online (Sandbox Code Playgroud)

  • @ P0W这也是我的想法,但是[nope](http://coliru.stacked-crooked.com/a/c3c3048525a93b69). (2认同)
  • 或者只是`std :: is_rvalue_reference <T &&> :: value`(https://ideone.com/1xNVhI) (2认同)