Нужно ли инициализировать элемент для получения его адреса?
Нет.
Можно ли инициализировать указатель на элемент данных перед инициализациейчлен?Другими словами, действительно ли это C ++?
Да.Да.
Нет ограничения, что операнд унарный и должен быть инициализирован.В стандарте есть пример в спецификации унарного оператора &:
int a;
int* p1 = &a;
Здесь значение a
неинициализировано, и на него можно указывать.
То, что этот пример не демонстрирует, указывает на объект до начала его жизни, что и происходит в вашем примере. Использование указатель на объект до и после его времени жизни явно разрешен, если память занята.Стандартный черновик гласит:
[basic.life] До начала срока службы объекта, но после того, как было выделено хранилище, которое будет занимать объект, или после окончания срока службы объекта и дохранилище, которое занимал объект, используется повторно или освобождается, любой указатель, представляющий адрес места хранения, где объект будет или был расположен, может использоваться, но только ограниченным образом ...
Правило продолжает перечислять, как использование ограничено.Вы можете обойтись со здравым смыслом.Короче говоря, вы можете обращаться с ним так же, как с void*
, за исключением того, что нарушение этих ограничений является UB, а не плохо сформировано.Аналогичное правило существует для ссылок.
Существуют также ограничения на вычисление адресов нестатических элементов.Стандартный черновик гласит:
[class.cdtor] ... Чтобы сформировать указатель (или получить доступ к значению) прямого нестатического члена объекта obj
, конструкция obj
должно начаться, а его уничтожение не должно быть завершено, в противном случае вычисление значения указателя (или доступ к значению элемента) приводит к неопределенному поведению.
В конструкторе Klass
,Построение Klass
началось, а уничтожение не завершено, поэтому вышеприведенное правило выполнено.
PS Ваш класс копируемый, но копия будет иметь указатель на член другого экземпляра.Подумайте, имеет ли это смысл для вашего класса.Если нет, вам потребуется реализовать пользовательские конструкторы копирования и перемещения и операторы присваивания.Самостоятельная ссылка, подобная этой, является редким случаем, когда вам могут понадобиться пользовательские определения для них, но не пользовательский деструктор, поэтому это исключение из правила пяти (или трех).
PPS Если ваше намерениедолжен указывать на один из членов, а не на какой-либо объект, кроме члена, тогда вы можете захотеть использовать указатель на член вместо указателя на объект.