Ответ 1
Время жизни A
не будет начато при вызове check()
, потому что из [base.life]:
Время жизни объекта типа
T
начинается, когда:
- с правильной настройкой и размером для типа
T
, и- Если объект имеет незапамятную инициализацию, его инициализация завершена.
A
имеет непустую инициализацию. Его инициализация завершена, когда из [class.base.init]/13:
В конструкторе без делегирования инициализация выполняется в следующем порядке:
- ...
- - Наконец, выполняется составная инструкция тела конструктора.
Однако, несмотря на то, что A
не имеет своего срока службы, стандарт дополнительно предоставляет в [class.base.init]/16:
Функции-члены (в том числе функции виртуальных членов, 10.3) могут быть вызваны для строящегося объекта... Однако, если эти операции выполняются в ctor-инициализаторе (или в функции, называемой непосредственно или косвенно из ctor-инициализатора) до того, как все инициализаторы mem для базовых классов завершены, результатом операции является undefined.
Что касается вопросов, касающихся жизни, нет никакой разницы между:
void check(const A& ) { .. }
struct A {
A() { check(*this); }
};
и
struct A {
void check() const { .. }
A() { check(); }
};
Последнее явно разрешено (как это не в ctor-инициализаторе), поэтому я не вижу оснований для исключения первого на всю жизнь.