С++ 11 §12.1/14:
Во время построения объекта const, если к объекту или любому из его подобъектов обращается доступ через значение l, которое равно не получено, прямо или косвенно, от конструкторов этого указатель, то полученное таким образом значение объекта или подобъекта неопределенные. [Пример:
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
перед вводом конструктора? Как это поведение отличается в случае, если используется неконстантный объект?