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 &lt;typename T&gt; std::enable_it_t&lt;std::is_same&lt;A, std::decay_t&lt;T&gt;&gt;::value&gt; f(T&amp;&amp;); 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&lt;int&gt; &amp;&amp; 在这里有什么用处?

以上是关于c ++接收const lvalue和rvalue引用参数而不重载[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c++接收问题为何cin能接收,scanf接收就出错?

C++ std::function 参数 const 参考

函数的使用

百度 c++/php 一二面凉经

SWIG+c+Python:传递和接收 c 数组

C++之const关键字的基本使用