【问题标题】:c++ receive const lvalue and rvalue reference parameter without overload [duplicate]c ++接收const lvalue和rvalue引用参数而不重载[重复]
【发布时间】: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;);
  • 如果你还是要复制,就按值传递。

标签: c++ c++11


【解决方案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; 在这里有什么用处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2011-09-12
  • 2015-02-27
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多