[C++] Ссылка на несконструированный обьект
Имхо, вполне валидной.
Но по ней можно вызвать методы или использовать поля еще не готового объекта! Это почти то же, что и оперировать со ссылкой на уже разрушенный объект, а такие называют невалидными…
С другой стороны, при реализации ссылок указателями ничто не мешает ей стать валидной после работы к-тора
Может ли ссылка из невалидной стать валидной?
С другой стороны, при реализации ссылок указателями ничто не мешает ей стать валидной после работы к-тора
Может ли ссылка из невалидной стать валидной?
А, ты в этом смысле.
Ну да, работать с объектом, доступным по ней можно будет только после выполнения конструктора.
Ну да, работать с объектом, доступным по ней можно будет только после выполнения конструктора.
При этом, обрати внимание, память на объект уже будет выделена и ошибки не произойдет при обращении по ссылке. Просто будут использоваться неиницализированные данные.
А где гарантии, что память уже будет выделена? Каким пунктом компилятору запрещено вызвать конструктор vermilion_street.first_brother до выделения памяти под vermilion_street.second_brother?
Если вызывается конструктор объекта класса elite, то память под него (и аггрегированные в него объекты) уже выделена.
Очень странно было бы, если бы это было не так, имхо. Пункт не знаю, надо смотреть стандарт
Очень странно было бы, если бы это было не так, имхо. Пункт не знаю, надо смотреть стандарт

3.7.4. Duration of sub-objects
The storage duration of member subobjects, base class subobjects and array elements is that of their complete object.

Это ещё что. Я вчера обнаружил великолепный баг gcc3.4.2
Output:
бред какой-то.
VC++ в строчке A a(_a_); переменную a ещё не считает объявленной, а mingw считает.
class A {
A{printf("A;\n");}
A(const A& a){printf("A(A a);\n");}
~A{printf("~A;\n");}
}
A a(a);
Output:
A(A a)
~A
бред какой-то.
VC++ в строчке A a(_a_); переменную a ещё не считает объявленной, а mingw считает.
А какому пункту стандарта это противоречит ?
Банальной логике противоречит
Как по-твоему я должен клонировать неинициализированный объект?
ЗЫ буду теперь писать private: A(const A& obj);
private: A& operator=(const A& obj);
Как по-твоему я должен клонировать неинициализированный объект?
ЗЫ буду теперь писать private: A(const A& obj);
private: A& operator=(const A& obj);
3.3.1/1 говорит, что это не баг, «a» уже объявлен на момент его инициализации.
ок, это не бага, это фича.
Нет, все же бага. VC++ 

А что он скажет на фразу
int a = a;
?
int a = a;
?
См. 3.3.1. Этот код там в качестве примера 

И точно 

Я худею.
Оставить комментарий
zzzzzzzzzzz
Что-то не могу найти в стандарте ответ на вопрос: будет ли валидной ссылка vermilion_street.first_brother.hommie?Вроде как нет, но почему?