void f(const std::vector<int>& v) //#1
{
std::vector<int> a(v);
...
}
void f(std::vector<int>&& v) //#2
{
std::vector<int> a(std::move(v));
...
}
是否有一些方法可以在一个函数中编写#1和#2而不会超载但是会达到相同的效果?我的意思是,如果参数是左值,那么使用复制构造函数,如果参数是rvalue,则使用移动构造函数。
如您所见,如果有多个参数,我需要写2 ^ n次重载。
答案 0 :(得分:-1)
你不需要两者!使用转发您可以轻松地写:
template < typename T >
void f(T&& t)
{
std::vector<int> v(std::forward<T>(t));
}
接下来所有这些调用都会起作用:
std::vector<int> a = { 1, 2, 3 };
f(std::move(a));
f(a);
const std::vector<int> b = { 1, 2, 3 };
f(b);