c ++接收const lvalue和rvalue引用参数而不重载

时间:2017-10-02 15:59:15

标签: c++ c++11

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次重载。

1 个答案:

答案 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);