C++ c++;接收常量左值和右值引用参数而不重载 void f(const std::vector&v)/#1 { std::载体a(v); ... } 空f(标准向量和向量)/#2 { std::向量a(std::move(v)); ... }

C++ c++;接收常量左值和右值引用参数而不重载 void f(const std::vector&v)/#1 { std::载体a(v); ... } 空f(标准向量和向量)/#2 { std::向量a(std::move(v)); ... },c++,c++11,C++,C++11,有没有办法在一个函数中写入#1和#2而不重载,但达到相同的效果?我的意思是,若参数是左值,那个么使用复制构造函数,若参数是右值,那个么使用移动构造函数 如您所见,如果有多个参数,我将需要编写2^n重载。您不需要同时使用这两个参数!使用转发,您可以轻松地编写: void f(const std::vector<int>& v) //#1 { std::vector<int> a(v); ... } void f(std::vector<int

有没有办法在一个函数中写入#1和#2而不重载,但达到相同的效果?我的意思是,若参数是左值,那个么使用复制构造函数,若参数是右值,那个么使用移动构造函数


如您所见,如果有多个参数,我将需要编写2^n重载。

您不需要同时使用这两个参数!使用转发,您可以轻松地编写:

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));
    ...
}
模板
无效f(T&T)
{
std::向量v(std::前向(t));
}
然后,以下所有调用都会起作用:

template < typename T >
void f(T&& t)
{
  std::vector<int> v(std::forward<T>(t));
}
std::vector a={1,2,3};
f(标准:移动(a)),;
f(a);
常数std::向量b={1,2,3};
f(b);

你不需要两者都要!使用转发,您可以轻松地编写:

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));
    ...
}
模板
无效f(T&T)
{
std::向量v(std::前向(t));
}
然后,以下所有调用都会起作用:

template < typename T >
void f(T&& t)
{
  std::vector<int> v(std::forward<T>(t));
}
std::vector a={1,2,3};
f(标准:移动(a)),;
f(a);
常数std::向量b={1,2,3};
f(b);

如果两个重载的作用相同,请删除第二个重载。如果他们不这样做,你可以使用一些模板魔术,但这确实是不必要的,而且在某些情况下不起作用(例如构造函数、赋值运算符)。我的意思是,你可以通过值来传递
A
,这将基本上与#2具有相同的效果(值将被移动构造)但是在#1的情况下会执行不必要的复制。类似于模板魔术:
template std::enable#it#t f(t&&)
afaik,可能是答案如果您仍在制作副本,只需按值传递即可。如果两个重载的作用相同,请删除第二个重载。如果他们不这样做,你可以使用一些模板魔术,但这确实是不必要的,而且在某些情况下不起作用(例如构造函数、赋值运算符)。我的意思是,你可以通过值来传递
A
,这将基本上与#2具有相同的效果(值将被移动构造)但是在#1的情况下会执行不必要的复制。类似于模板魔术:
template std::enable#it#t f(t&&)
afaik,可能是答案如果您正在复制,只需传递值。这不是转发reference@NathanOliver,你说得对。修复了实现。
f(std::move(b))--什么是
b
?您还没有声明它。@cdhowie,谢谢,复制粘贴错误好的,但是对const对象调用
std::move
的目的是什么?我们这里的
常量std::vector&
有什么用?这不是转发reference@NathanOliver,你说得对。修复了实现。
f(std::move(b))--什么是
b
?您还没有声明它。@cdhowie,谢谢,复制粘贴错误好的,但是对const对象调用
std::move
的目的是什么?我们在这里有什么用?