【发布时间】:2015-04-29 21:27:10
【问题描述】:
我阅读了几篇关于如何从方法中返回向量的帖子,其中包括:
我仍然对如何在 VS2013 中以正确的方式传递向量以及此代码中以下方法之间有什么区别感到困惑(问题在 cmets 中标记):
class Foo{
private:
std::vector<int> vect;
public:
//1 - classic way?
void GetVect(std::vector<int>& v)
{
v = vect;// assignment with swap?
}
//2 - RVO?
std::vector<int> GetVect()
{
return vect;
}
//3 - RVO with const?
std::vector<int> GetVect() const
{
return vect;
}
//4 - just move?
std::vector<int> GetVect()
{
return std::move(vect);
}
//5 - move with {}?
std::vector<int> GetVect()
{
return { std::move(vect) };
}
}
所以我不确定 //1 是否是 //2 的显式形式,不确定 3 是否有效。 4和5有什么区别?如果 RVO 适用于 VS2013 中的向量,如何测试它?
【问题讨论】:
-
我很困惑。当您的
GetVect()暗示它是一个 getter 函数时,您为什么还要担心复制省略和移动? -
Foo是否拥有该向量?GetVec是否应该授予对向量的只读访问权限?它应该允许写入向量吗?它应该转让所有权吗?这些问题的答案对于正确设计课程很重要。 -
您只想公开实际的
std::vector或其值吗? IE。通过引用传递对您来说重要吗? -
搬家当然不是这里的“替代方案”。它的作用与不动完全不同。
-
你想要的语义是什么?