我需要为我的类编写一个构造函数,它接受两个 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/