3

C++ では、Type **toType const **変換は禁止されています。derived **また、 からへの変換は許可されてBase **いません。

なぜこれらの変換は wtong なのですか? ポインターからポインターへの変換が発生しない他の例はありますか?

回避する方法はありますか: -->はそれを作成しないため、型の非 const オブジェクトTypeへのポインターへのポインターを、型の const オブジェクトへのポインターへのポインターに変換する方法はありますか?TypeType **Type const **

4

1 に答える 1

5

Type *toconst Type*は許可されています:

Type t;
Type *p = &t;
const Type*q = p;

*pを通じて変更することはできますpが、を通じて変更することはできませんq

Type **const Type**の変換が許可されている場合、

const Type t_const;

Type* p;
Type** ptrtop = &p;

const Type** constp = ptrtop ; // this is not allowed
*constp = t_const; // then p points to t_const, right ?

p->mutate(); // with mutate a mutator, 
// that can be called on pointer to non-const p

最後の行は変更される可能性がありconst t_constます。

derived **toBase **変換の場合、 と の型が同じ から派生する場合に問題が発生Derived1Derived2ますBase。それで、

Derived1 d1;
Derived1* ptrtod1 = &d1;
Derived1** ptrtoptrtod1 = &ptrtod1 ;

Derived2 d2;
Derived2* ptrtod2 = &d2;

Base** ptrtoptrtobase = ptrtoptrtod1 ;
*ptrtoptrtobase  = ptrtod2 ;

そして a は aDerived1 *を指しDerived2ます。

Type **const へのポインターへのポインターを作成する正しい方法は、それを にすることType const* const*です。

于 2013-04-21T12:04:37.450 に答える