Подтвердить что ты не робот

Разница между `const shared_ptr <T>` и `shared_ptr <const T>`?

Я пишу метод доступа для общего указателя на С++, который выглядит примерно так:

class Foo {
public:
    return_type getBar() const {
        return m_bar;
    }

private:
    boost::shared_ptr<Bar> m_bar;
}

Таким образом, чтобы поддерживать константу getBar(), возвращаемый тип должен быть boost::shared_ptr, который предотвращает модификацию Bar, на которую указывает. Я предполагаю, что shared_ptr<const Bar> - это тип, который я хочу вернуть, чтобы сделать это, тогда как const shared_ptr<Bar> предотвратит переназначение самого указателя, чтобы указать на другой Bar, но разрешить модификацию Bar, на которую он указывает. Однако я не уверен. Я был бы признателен, если кто-то, кто знает наверняка, может подтвердить это, или исправить меня, если я ошибаюсь. Спасибо!

4b9b3361

Ответ 1

Вы правы. shared_ptr<const T> p; похож на const T * p; (или, что эквивалентно, T const * p;), то есть заостренный объект const, тогда как const shared_ptr<T> p; похож на T* const p;, что означает, что p есть const. Вкратце:

shared_ptr<T> p;             ---> T * p;                                    : nothing is const
const shared_ptr<T> p;       ---> T * const p;                              : p is const
shared_ptr<const T> p;       ---> const T * p;       <=> T const * p;       : *p is const
const shared_ptr<const T> p; ---> const T * const p; <=> T const * const p; : p and *p are const.

То же самое верно для weak_ptr и unique_ptr.

Ответ 2

boost::shared_ptr<Bar const> предотвращает модификацию Bar через общий указатель. В качестве возвращаемого значения const в boost::shared_ptr<Bar> const означает, что вы не можете вызов функции non-const по возвращенному временному; если бы для реального указателя (например, Bar* const), это было бы полностью игнорируются.

В общем, даже здесь применяются обычные правила: const изменяет что предшествует этому: в boost::shared_ptr<Bar const>, Bar; в boost::shared_ptr<Bar> const, это экземпляр ( выражение boost::shared_ptr<Bar>, которое является константой.

Ответ 3

#Check this simple code to understand... copy-paste the below code to check on any c++11 compiler

#include <memory>
using namespace std;

class A {
    public:
        int a = 5;
};

shared_ptr<A> f1() {
    const shared_ptr<A> sA(new A);
    shared_ptr<A> sA2(new A);
    sA = sA2; // compile-error
    return sA;
}

shared_ptr<A> f2() {
    shared_ptr<const A> sA(new A);
    sA->a = 4; // compile-error
    return sA;
}

int main(int argc, char** argv) {
    f1();
    f2();
    return 0;
}