2015-12-17 13 views
12

std::unique_ptr::operator->だからoperator->がCONSTであるが、変更可能なポインタを返すシグネチャunique_ptr演算子 - > const-overloadedではないのはなぜですか?

pointer operator->() const noexcept; 

を有しています。これは、ようなコードが可能になります:

void myConstMemberFunction() const 
{ 
    myUniquePtrMember->nonConstFunction(); 
} 

はなぜ標準がこれを許可しない、そして上記のよう使用を防ぐための最善の方法は何ですか?

+0

。 – erip

+2

C++では 'const'が浅いです。 'int * const'は、オブジェクトへのポインタを変更することもできます。 –

+4

ポインタがスマートでない場合、同じコードを使用できます。 constはポインターに適用され、pointeeには適用されません。 – juanchopanza

答えて

17

は、通常のポインタのようにそれについて考える:

int * const i; 

は、非constintconstポインタです。 intは変更できますが、ポインタは変更できません。

int const * i; 

constintに非constポインタです。ポインタは変更できますが、intは変更できません。


さて、unique_ptrのために、それはconstが内部または<>外に出たかどうかの質問です。したがって:

std::unique_ptr<int> const u; 

は最初のものと同じです。 intは変更できますが、ポインタは変更できません。 int

std::unique_ptr<int const> u; 

あなたはポインタを変更することができますが、ない:

何が欲しいのです。それともさえ:ここ

std::unique_ptr<int const> const u; 

あなたはポインタまたはintを変更することはできません。


私はいつも右にconstを配置していますか?これは少し珍しいことですが、ポインタを扱うときには必要です。 constは、常にそのすぐ左側のものに適用され、(ポインタはconst)またはintです。 http://kuhllib.com/2012/01/17/continental-const-placement/を参照してください。 int const *を考えることにあなたを導く可能性があるconst intを書く

は、間違っている非constintconst -pointer、です。

7

伝統的なポインタのセマンティクスを再現します。 constポインタは、変更できないポインタです。しかし、それが指すオブジェクトは可能です。指示先を変異避けるため

struct bar { 
    void do_bar() {} 
}; 

struct foo { 
    void do_foo() const { b->do_bar(); } // OK 
    bar* const b; 
}; 

、私は、オペレータが `.`が過負荷にすることができないからだと予想されるのconstへのconstポインタのunique_ptr同等のものを必要とする、または

const std::unique_ptr<const bar> b; 
関連する問題