我一直在搞乱SFML,弄清楚如何构建一个简单的2D游戏。我刚注意到这种行为,无法弄清楚发生了什么。令我困惑的示例代码:
struct Unique {};
class Shared {
public:
Shared() {
p = make_unique<Unique>();
}
unique_ptr<Unique> p;
};
void SharedCopyTest() {
Shared foo;
//Shared copy = foo; // Error: function "Shared::Shared(const Shared &)"
// (declared implicitly) cannot be referenced
// -- it is a deleted function
shared_ptr<Shared> sharedPtr = make_shared<Shared>();
shared_ptr<Shared> ptrCopy = sharedPtr; // No error
}
此时,&sharedPtr->p == &ptrCopy->p
;但如果p
的类型为unique_ptr<T>
,那又怎么可能?
答案 0 :(得分:2)
std::shared_ptr
的语义是没有指向对象的副本。相反,它是复制的std::shared_ptr
对象本身,它会增加共享指针的使用计数器。
这就是为什么它有效,因为你实际上没有复制Shared
对象。
这可以通过使用共享指针get
函数轻松验证,以获得&#34; raw&#34;指针:
sharedPtr.get() == ptrCopy.get()