Построение const объекта

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 перед входом в конструктор? Как это поведение отличается в случае использования неконстантного объекта?

13
задан Cheers and hth. - Alf 5 January 2012 в 07:30
поделиться