Я бы сказал, что ответ Тони, который вы пометили как правильный, неправильный, а ответ Майкла Барра правильный.
Чтобы изложить то, что он сказал более четко (по крайней мере, для меня):
Есть два возможных места для недопонимания:
- Как работает неявное const
- Способ интерпретации
this
при создании объекта const
1.Неявное Const
Неявное const (внутренняя константа для ConstCheater
, когда она сделана const
) не превращает cc
в pointer-to-const
, а скорее const-pointer
, то есть когдаВы делаете это:
const ConstCheater cc(7);
Внутренне идет от:
ConstCheater * ccp;
... до ...
ConstCheater * const ccp;
... а не ...
const ConstCheater * ccp;
, что, возможно, ожидалось.
2.Построение const
объекта
Более странно то, что this
разрешено передавать инициализатору cpp
в конструкторе, поскольку this
, как можно подумать, следует рассматривать какpointer-to-const
, и, следовательно, не является допустимым значением для передачи const-pointer
.
То есть можно ожидать:
...: ccp(this) ... // expected to fail but doesnt
потерпит неудачу, потому что концептуально можно ожидать, чтоэто было (несколько) эквивалентно:
const ConstCheater cc(7);
const ConstCheater * const this = &cc; // const-pointer-to-const
и, таким образом, вы могли бы подумать, что:
ConstCheater * const ccp = this; //expected error!
потерпит неудачу!Но это не так, потому что, очевидно, во время строительства очевидно, что this
обрабатывается специально, как если бы это было:
const ConstCheater * this = &cc;
, и, таким образом, объект фактически не является постоянным во время строительства.
Яне уверен, что я полностью понимаю причину, но Майкл Барр указывает на то, что, по-видимому, существует логический и технический барьер для обеспечения ожидаемого поведения, поэтому стандарт, похоже, отражает нынешнее несколько странное поведение.
Я недавно спросилсвязанный с этим вопрос: Почему C ++ не имеет конструктора const? , но до сих пор не совсем понял причины, по которым он был бы несостоятельным, хотя я полагаю, что это обременительно для разработчиков на C ++определить неуклюжий конструктор const для любого класса, из которого они хотели бы создать объект const.