const ссылается на публичный член на частный член класса - почему это работает?

Недавно я обнаружил интересную дискуссию о том, как разрешить доступ только для чтения к закрытым членам, не запутывая дизайн с несколькими геттерами, и одним из предложений было сделать это следующим образом:

#include 

class A {
public:
  A() : _ro_val(_val) {}
  void doSomething(int some_val) {
    _val = 10*some_val;
  }
  const int& _ro_val;
private:
  int _val;
};

int main() {
  A a_instance;
  std::cout << a_instance._ro_val << std::endl;
  a_instance.doSomething(13);
  std::cout << a_instance._ro_val << std::endl;
}

Результат:

$ ./a.out 
0
130

GotW В # 66 четко указано, что время жизни объекта начинается

, когда его конструктор завершается успешно и нормально возвращается. То есть управление достигает конца тела конструктора или более раннего оператора возврата.

В таком случае у нас нет гарантии, что член _val будет правильно создан к моменту выполнения _ro_val (_val) . Так как же работает приведенный выше код? Это неопределенное поведение? Или примитивным типам предоставляется какое-то исключение для времени жизни объекта?

Может ли кто-нибудь указать мне ссылку, которая объяснит эти вещи?

7
задан 28 October 2011 в 10:08
поделиться