[C++] Ссылка на несконструированный обьект

zzzzzzzzzzz

Что-то не могу найти в стандарте ответ на вопрос: будет ли валидной ссылка vermilion_street.first_brother.hommie?

struct brother
{
brother & hommie;
brother( brother & real_hommie ) : hommie( real_hommie ) {}
};
struct elite
{
brother first_brother, second_brother;
elite : first_brother( second_brother second_brother( first_brother ) {}
};
elite vermilion_street;

Вроде как нет, но почему?

bobby

Имхо, вполне валидной.

zzzzzzzzzzz

Но по ней можно вызвать методы или использовать поля еще не готового объекта! Это почти то же, что и оперировать со ссылкой на уже разрушенный объект, а такие называют невалидными…
С другой стороны, при реализации ссылок указателями ничто не мешает ей стать валидной после работы к-тора
Может ли ссылка из невалидной стать валидной?

bobby

А, ты в этом смысле.
Ну да, работать с объектом, доступным по ней можно будет только после выполнения конструктора.

bobby

При этом, обрати внимание, память на объект уже будет выделена и ошибки не произойдет при обращении по ссылке. Просто будут использоваться неиницализированные данные.

zzzzzzzzzzz

А где гарантии, что память уже будет выделена? Каким пунктом компилятору запрещено вызвать конструктор vermilion_street.first_brother до выделения памяти под vermilion_street.second_brother?

bobby

Если вызывается конструктор объекта класса elite, то память под него (и аггрегированные в него объекты) уже выделена.
Очень странно было бы, если бы это было не так, имхо. Пункт не знаю, надо смотреть стандарт

bobby

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.

zzzzzzzzzzz

korsar0156

Это ещё что. Я вчера обнаружил великолепный баг gcc3.4.2

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 считает.

ppplva

А какому пункту стандарта это противоречит ?

korsar0156

Банальной логике противоречит
Как по-твоему я должен клонировать неинициализированный объект?
ЗЫ буду теперь писать private: A(const A& obj);
private: A& operator=(const A& obj);

zzzzzzzzzzz

3.3.1/1 говорит, что это не баг, «a» уже объявлен на момент его инициализации.

korsar0156

ок, это не бага, это фича.

ppplva

Нет, все же бага. VC++

Flack_bfsp

А что он скажет на фразу
int a = a;
?

zzzzzzzzzzz

См. 3.3.1. Этот код там в качестве примера

Flack_bfsp

И точно

korsar0156

Я худею.
Оставить комментарий
Имя или ник:
Комментарий: