Разница между `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
, на которую он указывает. Однако я не уверен. Я был бы признателен, если кто-то, кто знает наверняка, может подтвердить это, или исправить меня, если я ошибаюсь. Спасибо!
Ответы
Ответ 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;
}