【发布时间】:2014-08-05 19:15:36
【问题描述】:
我有一个场景,我使用传递引用获取 MyClass 的向量,如下所示:
std::vector<shared_ptr<MyClass>>& x = myObj->getVector();
但是当我这样做时:
x.clear();
我期望 myObj 中的底层向量大小为零,因为我使用传递引用检索它。然而,这种情况并非如此。这是为什么呢?
编辑:
返回的向量是一个数据成员,而不是在getVector() 中创建的向量。
EDIT2:这是getVector():
std::vector<shared_ptr<MyClass>> myVec;
std::vector<shared_ptr<MyClass>> getVector(){
return myVec;
}
【问题讨论】:
-
getVector是否通过引用返回?如果没有,您的代码不应该编译。 -
@ghostofstandardspast 不,它只是返回对象但是......我被引导相信方法的返回类型不是决定 PbR/PbV 的,它是调用代码(我的部分已在上面发布)有“&”?另外,我正在返回一个类数据成员......
-
如果按值返回,您的对象将被复制/移动/RVOd 出。如果您没有将引用放在
x上,则会将其复制/移动到x。实际上,您的代码无效,因为右值无法绑定到左值引用。 -
如果它返回一个值 copy,而不是非常量引用,那么要么您使用的编译器允许非常量引用临时变量(又名 MSVC ),或者该代码应该呕吐。无论哪种方式,原始向量都没有被清除。 显示
getVector()的声明。如果不返回引用,则不会修改成员。 -
发布
getVector()的代码会很有用,这样我们就可以仔细检查它不是在创建副本。myObj类的定义也会有所帮助
标签: c++ vector pass-by-reference