【发布时间】:2013-06-27 13:03:36
【问题描述】:
对于启用移动的课程,这两者之间有区别吗?
struct Foo {
typedef std::vector<std::string> Vectype;
Vectype m_vec;
//this or
void bar(Vectype&& vec)
{
m_vec = std::move(vec);
}
//that
void bar(Vectype vec)
{
m_vec = std::move(vec);
}
};
int main()
{
Vectype myvec{"alpha","beta","gamma"};
Foo fool;
fool.bar(std::move(myvec));
}
我的理解是,如果你使用左值myvec,你还需要引入const
Vectype& 版本的Foo::bar(),因为Vectype&& 不会绑定。除此之外,在右值的情况下,Foo::bar(Vectype) 将使用移动构造函数构造向量,或者更好地忽略所有副本,因为 vec 是一个右值(会吗?)。那么是否有一个令人信服的理由不喜欢通过值声明而不是左值和右值重载?
(考虑到无论如何我都需要将向量复制到成员变量中。)
【问题讨论】:
-
在任何迂腐之前,我都知道重载是模棱两可的。
标签: c++ c++11 rvalue-reference