为什么 std::enable_shared_from_this 不使用可变的 std::weak_ptr?



我知道大多数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实现?

为了阐明以下答案:它是用标记为mutablestd::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函数中,thisconst

相关内容

  • 没有找到相关文章

最新更新