c++ - 具有 move 和复制语义的构造函数

标签 c++ move

我需要为我的类编写一个构造函数,它接受两个 std::vector 作为参数。这些 vector 必须在私有(private)成员中复制,我想在我的用户传递临时或右值引用时使用 move 语义,否则使用复制语义。这是一个常见的问题,它导致编写一个拷贝和一个 move 构造函数来处理从同一类的对象开始的构造。但在我的例子中,我从两个不同的参数( vector )开始构建,每个参数都可以是左值或右值;所以我必须处理四种不同的情况:

MyClass(const std:vector<float> &v1, const std::vector<float> &v2):
  _v1(v1), _v2(v2) {};
MyClass(const std:vector<float> &v1, std::vector<float> &&v2):
  _v1(v1), _v2(std::move(v2)) {};
MyClass(std:vector<float> &&v1, const std::vector<float> &v2):
  _v1(std::move(v1)), _v2(v2) {};
MyClass(std:vector<float> &&v1, std::vector<float> &&v2): 
  _v1(std::move(v1)), _v2(std::move(v2)) {};

其中每一个都需要相同构造函数逻辑的小变体,以及类似代码片段的令人不快的增殖。如果添加其他 vector 参数,情况会呈指数级恶化。处理这种情况的最佳做法是什么?谢谢。

最佳答案

您可以简单地按值传递:

MyClass(std::vector<float> v1, std::vector<float> v2)
    : _v1(std::move(v1)), _v2(std::move(v2)) {}

它是以每个参数调用一个额外的 move 构造函数为代价的(无论参数是左值还是右值),这可能会也可能不会被优化掉。

关于c++ - 具有 move 和复制语义的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53153668/

相关文章:

c++ - 具有左值的C++ std::move()性能明智

Python 根据名称 move 文件

c++ - 初始化列表和 std::forward

c++ - 为什么 move on const 对象有效?

java - 无法在 mesos 上运行测试框架

c++ - 一个类可以继承自另一个具体化的类模板吗?

c++ - 为什么只有第二个数组维度很重要?

c# - 在 C# 中使用 C++ 库

c++ - std::move 操作 C++

c++ - 如何将对象的所有权传递给函数外部