0

我了解大多数 std 库实现选择std::enable_shared_from_this通过将 a 存储std::weak_ptr在基类中来实现。这导致以下情况:

#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()但实际上并没有改变目标对象。这似乎是可变对象的理想用途,因此shared_from_this()可以将其标记为const相对于派生对象。

为什么不使用 实现mutable

为了阐明下面的答案:它是用std::weak_ptr标记的 实现的mutable,但这只允许std::weak_ptr被突变,而不是让我们将非const传递给其他人。

4

1 回答 1

1

这些都无法编译

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.

于 2020-10-08T06:48:40.277 回答