有必要根据调用的重载push_back
(左值或右值)调用相应的构造函数(复制或移动):
struct tmpS {
tmpS() {}
tmpS(const tmpS& s) {
std::cout << "copy\n";
}
tmpS(tmpS&& s) {
std::cout << "move\n";
}
};
template<typename Type>
void pass_to_construct(Type&& arg) { // универсальная ссылка
tmpS t = std::forward<Type>(arg);
}
template<typename T>
struct v {
v() {}
void push_back(T&& value) { // вызовется эта перегрузка
pass_to_construct(value);
}
void push_back(const T& value) {
pass_to_construct(value);
}
};
int main()
{
v<tmpS> s;
s.push_back(tmpS()); // rvalue
}
上面的代码调用复制构造函数(打印副本)。为什么不动?
试试这样:
没有这个,
pass_to_construct
总是传入一个左值,也就是函数参数。这是工作代码:https ://ideone.com/P4jR4w
另外的选择 -
哪个选项更正确 - 我不确定......在这种情况下它们都可以工作的感觉。
[PS经过一番思考-在这种情况下没有通用参考,所以最好使用
move
。]但是在
pass_to_construct
您的版本中,在这两种情况下,您都将参数传递给调用函数,即 左值无疑是...“我想是的”......(c)维尼