я прочитал вопрос, размещенном на Why does C++ not have a const constructor?Почему преобразование из сопзЬ сопзЬ указатель на константный указатель на-на-nonconst в списке инициализатора позволило
Я до сих пор путают, почему эта программа может скомпилировать. И я попытался предложить свое мнение по этому вопросу, я не знаю, почему он был удален. Поэтому я должен снова задать вопрос.
Вот программа
class Cheater
{
public:
Cheater(int avalue) :
value(avalue),
cheaterPtr(this) //conceptually odd legality in const Cheater ctor
{}
Cheater& getCheaterPtr() const {return *cheaterPtr;}
int value;
private:
Cheater * cheaterPtr;
};
int main()
{
const Cheater cheater(7); //Initialize the value to 7
// cheater.value = 4; //good, illegal
cheater.getCheaterPtr().value = 4; //oops, legal
return 0;
}
И моя путаница:
const Cheater cheater(7)
создает константный объект мошенника, в его конструктор
Cheater(int avalue) :
value(avalue),
cheaterPtr(this) //conceptually odd legality in const Cheater ctor
{}
'это' указатель был использован для инициализации cheaterPtr
.
Я думаю, что это не должно быть правильно. cheater
- объект const, который должен выглядеть примерно так: const Cheater* const this;
, что означает, что указатель он сам и объект, на который указывает указатель, должны оба const, мы не можем ни изменить значение указателя, ни изменить объект, на который указывает указатель.
но объект cheater
cheaterPtr
участник что-то вроде Cheater* const cheaterPtr
. Это означает, что указатель const, но объект, на который он указывает, может быть неконстом.
Как мы знаем, указатель на сопзЬ указатель к nonconst преобразования не допускается:
int i = 0;
const int* ptrToConst = &i;
int * const constPtr = ptrToConst; // illegal. invalid conversion from 'const int*' to 'int*'
Как преобразование указателя к сопзЬ указателя к nonconst допускается в список инициализаторов? Что на самом деле произошло?
А вот Описана о «константности» в конструкторах я пытался предложить оригинальный пост:.
«В отличии от других функций-членов, конструкторы не могут быть объявлены как константы Когда мы создаем константный объект class object, объект не принимает свою «константу» до тех пор, пока конструктор не завершит инициализацию объекта. Таким образом, конструкторы могут писать объекты const во время их построения ».
++ Primer-C (5-е издание) P262 7.1.4 Конструкторы
О, я понял, этот указатель не const, пока строительство не завершится. Но это кажется логически неправильным: вы говорите, что объект const, вы обещаете не изменять его, но позже вы можете использовать этот трюк, чтобы его изменить. Это недостаток C++? – Linlix