c ++接收const lvalue和rvalue引用参数而不重载[重复]
Posted
技术标签:
【中文标题】c ++接收const lvalue和rvalue引用参数而不重载[重复]【英文标题】:c++ receive const lvalue and rvalue reference parameter without overload [duplicate] 【发布时间】: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 可能是答案
如果你还是要复制,就按值传递。
【参考方案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);
【讨论】:
这不是转发参考 @NathanOliver,你是对的。修复了实现。f(std::move(b));
-- 什么是b
?你还没有声明它。
@cdhowie,谢谢,复制粘贴错误
好的,但是在 const 对象上调用 std::move
的目的是什么? const std::vector<int> &&
在这里有什么用处?以上是关于c ++接收const lvalue和rvalue引用参数而不重载[重复]的主要内容,如果未能解决你的问题,请参考以下文章