C++11 §12.1/14:
Во время создания const-объекта, если к значению объекта или любого из его подобъектов обращаются через l-значение, которое не получено прямо или косвенно из ... не получено, прямо или косвенно, из указателя this конструктора. указателя конструктора, значение объекта или подобъекта, полученное таким образом, является не определено. [Пример:
struct C;
void no_opt(C*);
struct C {
int c;
C() : c(0) { no_opt(this); }
};
const C cobj;
void no_opt(C* cptr) {
// value of cobj.c is unspecified
int i = cobj.c * 100;
cptr->c = 1;
// value of cobj.c is unspecified
cout << cobj.c * 100 << '\n';
}
Компиляция приведенного выше примера выводит 100
. Мой вопрос в том, почему значение cobj.c
должно быть неопределенным, если список инициализации устанавливает его в 0
перед входом в конструктор? Как это поведение отличается в случае использования неконстантного объекта?