Рассмотрим следующий пример.Когда создается bar
, он дает конструктору базового типа (foo
) адрес my_member.y
, где my_member
- элемент данных, который еще не был инициализирован.
struct foo {
foo(int * p_x) : x(p_x) {}
int * x;
};
struct member {
member(int p_y) : y(p_y) {}
int y;
};
struct bar : foo
{
bar() : foo(&my_member.y), my_member(42) {}
member my_member;
};
#include <iostream>
int main()
{
bar my_bar;
std::cout << *my_bar.x;
}
Этохорошо определены?Законно ли брать адрес элемента данных неинициализированного объекта?Я нашел этот вопрос о передаче ссылки на неинициализированный объект, но это не совсем то же самое.В этом случае я использую оператор доступа к элементу .
для неинициализированного объекта.
Это правда, что адрес элемента данных объекта не должен изменяться при инициализации,но это не обязательно делает взятие того адреса четко определенным.Кроме того, на странице ccpreference.com на операторах доступа к элементу есть следующее:
Первый операнд обоих операторов оценивается, даже если в этом нет необходимости (например, когда второйоперанд называет статический член).
Я понимаю, что это означает, что в случае &my_member.y
my_member
будет оцениваться, что я считаю хорошим (например, int x; x;
кажется хорошим), ноЯ также не могу найти документацию, подтверждающую это.