【发布时间】:2012-06-12 18:39:25
【问题描述】:
考虑:
#include <cstdlib>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
class Gizmo
{
public:
Gizmo() : foo_(shared_ptr<string>(new string("bar"))) {};
Gizmo(Gizmo&& rhs); // Implemented Below
private:
shared_ptr<string> foo_;
};
/*
// doesn't use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(rhs.foo_)
{
}
*/
// Does use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(std::move(rhs.foo_))
{
}
int main()
{
typedef vector<Gizmo> Gizmos;
Gizmos gizmos;
generate_n(back_inserter(gizmos), 10000, []() -> Gizmo
{
Gizmo ret;
return ret;
});
random_shuffle(gizmos.begin(), gizmos.end());
}
在上面的代码中,Gizmo::Gizmo(Gizmo&&) 有两个版本——一个使用std::move 来实际移动shared_ptr,另一个只是复制shared_ptr。
这两个版本似乎都在表面上起作用。一个区别(我能看到的唯一区别)是在非move 版本中,shared_ptr 的引用计数暂时增加,但只是短暂增加。
我通常会继续使用move shared_ptr,但只是为了在我的代码中保持清晰和一致。我在这里错过了一个考虑吗?出于任何技术原因,我应该更喜欢一个版本吗?
【问题讨论】:
-
在移动构造函数中移动至少在语义上是一致的......
-
为什么要将字符串保存在 shared_ptr 中? shared_ptr 作为成员变量通常是糟糕设计的标志。
-
在移动构造函数中移动符合编译器自动生成的内容。
-
@ViktorSehr:“shared_ptr 作为成员变量通常是糟糕设计的标志。”你为什么这么认为?如果您的对象与另一个对象共享一个对象的所有权,那么拥有
shared_ptr数据成员并没有错... -
@ViktorSehr:如果将 shared_ptr 放入成员变量中是不好的设计……您还会 把它放在哪里?如果对象不能共享某物的所有权,那么共享所有权有多大用处?
标签: c++ c++11 shared-ptr rvalue-reference