我知道大多数std库实现都选择通过在基类中存储std::weak_ptr
来实现std::enable_shared_from_this
。这导致以下情况:
#include <memory>
class Foo : public std::enable_shared_from_this<Foo>
{
public:
std::shared_ptr<Foo> GetSharedBar() const
{
// returns shared_ptr<const Foo> instead of std::shared_ptr<Foo>
return shared_from_this();
// Error in VC++2019 due to mismatch.
}
};
我似乎很清楚,尽管需要更新引用计数,shared_from_this()
实际上并没有改变目标对象。这似乎是mutable的理想用途,因此shared_from_this()
可以相对于派生对象标记为const
。
为什么它没有用mutable
实现?
为了阐明以下答案:它是用标记为mutable
的std::weak_ptr
实现的,但这只允许std::weak_ptr
发生突变,而不是让我们把非const
交给其他人。
这两者都无法编译:
class Foo : public std::enable_shared_from_this<Foo>
{
public:
std::shared_ptr<Foo> GetSharedBar() const
{
// error: could not convert from 'shared_ptr<const Foo>' to 'shared_ptr<Foo>'
return shared_from_this();
}
};
class Bla
{
public:
Bla* getThis() const
{
// error: invalid conversion from 'const Bla*' to 'Bla*'
return this;
}
};
但是,如果从函数中删除const
,它们都可以工作。问题是在const
成员函数中,this
指针是const
指针。
另一个例子是:
class kluf
{
const std::string* k;
std::string* getK()
{
// error: invalid conversion from 'const string*' to 'std::string*'
return k;
}
};
很明显,您不允许将const
成员交给处于非const
状态的其他人。这也适用于this
指针,并且在const
函数中,this
是const
。