Недавно я обнаружил интересную дискуссию о том, как разрешить доступ только для чтения к закрытым членам, не запутывая дизайн с несколькими геттерами, и одним из предложений было сделать это следующим образом:
#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)
. Так как же работает приведенный выше код? Это неопределенное поведение? Или примитивным типам предоставляется какое-то исключение для времени жизни объекта?
Может ли кто-нибудь указать мне ссылку, которая объяснит эти вещи?