考虑这些类:
#include <iostream>
#include <string>
class A
{
std::string test;
public:
A (std::string t) : test(std::move(t)) {}
A (const A & other) { *this = other; }
A (A && other) { *this = std::move(other); }
A & operator = (const A & other)
{
std::cerr<<"copying A"<<std::endl;
test = other.test;
return *this;
}
A & operator = (A && other)
{
std::cerr<<"move A"<<std::endl;
test = other.test;
return *this;
}
};
class B
{
A a;
public:
B (A && a) : a(std::move(a)) {}
B (A const & a) : a(a) {}
};
创建 时B
,我总是有一个最佳的正向路径A
,一个右值的移动或一个左值的副本。
是否可以使用一个构造函数实现相同的结果?这种情况下问题不大,但是多参数呢?我需要参数列表中每个可能出现的左值和右值的组合。
这不仅限于构造函数,还适用于函数参数(例如 setter)。
注意:这个问题严格来说是关于class B
; class A
存在只是为了可视化复制/移动调用是如何执行的。