Рассмотрим следующий пример. Когда 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;
кажется хорошим), но я также не могу найти документацию, подтверждающую это.
.
и->
. - person user7860670   schedule 25.04.2018.
в&my_member.y
. - person François Andrieux   schedule 25.04.2018&my_member.y
на самом деле не в адресе оператора, а скорее в операторе доступа к членам, который оценивает еще не инициализированный объект. Я должен был прочитать вопрос более внимательно. - person user7860670   schedule 25.04.2018