C++ 11 §12.1/14:Строительства константного объекта
При строительстве константного объекта, если значение объекта или любых из его подобъектов доступно через именующий, что это не полученным, прямо или косвенно, от указателя этого конструктора , значение объекта или подобъекта, полученного таким образом, равно неуказанным. [Пример:
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
перед вводом конструктора? Как это поведение отличается в случае, если используется неконстантный объект?
Я хотел бы отметить, что в примере выше 'cobj.c', до того, как 'cobj' будет полностью построен. Мне кажется, что даже для неконстантных объектов это действие сомнительно. –
@ MatthieuM. Зачем? Выглядит на мой взгляд (даже если вы добавите базовый класс в структуру C). –
@VJovic: до тех пор, пока конструктор не запустился, объект еще не оживлен - см. Вопрос Саттера в [Ошибки конструктора (или объекты, которые никогда не были)] (http://www.gotw.ca/publications /mill13.htm). Если объект еще не жив, доступ к нему сомнительный. Я не говорю, что это обязательно неопределенный или неопределенный, просто он «плохо пахнет». –