【发布时间】:2017-10-02 15:59:15
【问题描述】:
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 而不会重载但达到相同的效果?我的意思是,如果参数是左值,则使用复制构造函数,如果参数是右值,则使用移动构造函数。
如你所见,如果有多个参数,我将需要编写 2^n 个重载。
【问题讨论】:
-
如果两个重载都做同样的事情,则删除第二个。如果他们不这样做,您可以使用一些模板魔法,但这确实是不必要的,并且在某些情况下不起作用(例如构造函数,赋值运算符)。
-
我的意思是,您可以改为通过值传递
A,这将具有与#2 基本相同的效果(该值将被移动构造)但在这种情况下会执行不必要的复制#1。 -
类似模板魔法的东西:
template <typename T> std::enable_it_t<std::is_same<A, std::decay_t<T>>::value> f(T&&); -
afaik, en.cppreference.com/w/cpp/utility/forward 可能是答案
-
如果你还是要复制,就按值传递。