私は、C++で次のような共有ポインタ用のアクセサメソッドを作成しています。
class Foo {
public:
return_type getBar() const {
return m_bar;
}
private:
boost::shared_ptr<Bar> m_bar;
}
したがって、getBar()
のconst-nessをサポートするには、戻り値の型は、Bar
の変更を防ぐboost::shared_ptr
である必要があります。私のguessは、shared_ptr<const Bar>
がそれを行うために返したいタイプであるのに対し、const shared_ptr<Bar>
は別のBar
を指すようにポインター自体の再割り当てを防ぎますしかし、それが指すBar
の変更を許可します...しかし、私にはわかりません。確かに知っている誰かがこれを確認するか、私がそれを間違えたならば私を修正することができるならば、私はそれを感謝します。ありがとう!
あなたが正しいです。 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
についても同様です。
#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;
}
@Cassio Neriの答えに基づいた簡単なデモをしたいと思います:
#include <memory>
int main(){
std::shared_ptr<int> i = std::make_shared<int>(1);
std::shared_ptr<int const> ci;
// i = ci; // compile error
ci = i;
std::cout << *i << "\t" << *ci << std::endl; // both will be 1
*i = 2;
std::cout << *i << "\t" << *ci << std::endl; // both will be 2
i = std::make_shared<int>(3);
std::cout << *i << "\t" << *ci << std::endl; // only *i has changed
// *ci = 20; // compile error
ci = std::make_shared<int>(5);
std::cout << *i << "\t" << *ci << std::endl; // only *ci has changed
}