在boost :: scoped_ptr中operator*,operator->它们是声明的const函数,尽管它们返回T&并且T*可能允许客户端更改底层数据.这违反了逻辑常量的概念(Myers,Effective C++)
const函数不应该有签名吗?
const T& operator*() const;
const T* operator->() const;
Run Code Online (Sandbox Code Playgroud) 这不编译,
#include <boost/intrusive_ptr.hpp>
class X
{
public:
void intrusive_ptr_add_ref(X* blah)
{
}
void intrusive_ptr_release(X * blah)
{
}
};
int main()
{
boost::intrusive_ptr<X> ex(new X);
}
Run Code Online (Sandbox Code Playgroud)
但这样做:
#include <boost/intrusive_ptr.hpp>
class X
{
public:
friend void intrusive_ptr_add_ref(X* blah)
{
}
friend void intrusive_ptr_release(X * blah)
{
}
};
int main()
{
boost::intrusive_ptr<X> ex(new X);
}
Run Code Online (Sandbox Code Playgroud)
还有这个 :
#include <boost/intrusive_ptr.hpp>
class X
{
public:
};
void intrusive_ptr_add_ref(X* blah)
{
}
void intrusive_ptr_release(X * blah)
{
}
int main()
{
boost::intrusive_ptr<X> ex(new X); …Run Code Online (Sandbox Code Playgroud) 有人会这样做吗?例如:
Client* client = it->second;
Run Code Online (Sandbox Code Playgroud)
其中 - >第二个是boost :: shared_ptr到Client错误:
cannot convert `const ClientPtr' to `Client*' in initialization
Run Code Online (Sandbox Code Playgroud) 我刚开始学习智能指针,遇到了一个似乎与理论相矛盾的情况。例如,当我们使用 shared_ptr 并且如果调用复制语义时,对象共享所有权并且引用计数为 2。这是可以理解的。例如代码。
class Test {
public:
Test(){ cout << "Const" << "\n"; }
void Disp(){
cout << "Class Test()\n";
}
~Test(){ cout << "Dest" << "\n"; }
};
int main()
{
Test *p = new Test();
shared_ptr<Test> p1(p);
shared_ptr<Test> p2(p1); // = make_shared<Test>(*p1);
p1->Disp();
p2->Disp();
}
Run Code Online (Sandbox Code Playgroud)
输出很好,因为:
Const
Class Test()
Class Test()
Dest
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试将语义移动为
int main()
{
Test *p = new Test();
shared_ptr<Test> p1(p);
shared_ptr<Test> p2 = make_shared<Test>(*p1);
p1->Disp();
p2->Disp();
}
Run Code Online (Sandbox Code Playgroud)
那么 p1 应该已经失去了所有权。因此 p1->Disp() 应该是有效的。因为 make_shared 将转移所有权并重置 …