Является ли поведение следующего кода четким?Ссылка на объект перед построением
struct X { int i; }; // trivial
struct Y : X { Y(){} }; // non-trivial
extern X xobj;
int& r1 = xobj.i; // #1
X xobj;
extern Y yobj;
Y& r2 = yobj; // #2
// int& r3 = yobj.i; // #3 - this is UB according to the standard
Y yobj;
Этот код вдохновлен, например, в стандарте С ++, а именно проект N4140 [class.cdtor]/1.
Вот что гласит, что пункт:
Для объекта с нетривиальным конструктором, обращаясь к любому нестатического члену или базовый классу объекта перед конструктором начинает результаты выполнения в непредсказуемом поведении. Для объекта с нетривиальным деструктором , ссылаясь на любой нестатический член или базовый класс объекта после завершения выполнения деструктора , результат приводит к неопределенному поведению.
Ниже приведен пример, который показывает, как указатели могут и не могут быть связаны с объектами.
Так интуитивно кажется, что #1
и #2
хорошо определены, в то время как #3
вызывает UB, если раскомментировать, но, во-первых, примеры не являются нормативными, во-вторых, нет никакого упоминания ссылок в данном примере, и третье, и самое важное , вышеприведенный параграф не означает, что в противном случае поведение четко определено. Или это? Или, может быть, есть другая соответствующая цитата в стандарте, который я пропустил?
Edit: Ответ может (возможно) будет да, если объекты имеют статическую продолжительность хранения, но они могут быть также локальным, например:
struct A { A(){} };
struct B { B(A&){} };
struct C {
B b;
A a;
C() : b(a) {}
};
int main() {
C c;
}
На самом деле это было первоначальное вдохновение для этого вопроса, см Circular dependency in constructor initialization list
«обращение к любому нестационарному члену [...] приводит к неопределенному поведению» - ссылка - это именно то, что делает ссылка (отсюда и название). – molbdnilo
@molbdnilo Я это понимаю, но это не объясняет, что происходит * в противном случае * (например, ссылаясь на ... до того, как конструктор начнет для класса с тривиальным конструктором), вот в чем вопрос. –
«ссылаясь на это» означает упоминание об этом (это английское слово «refer»). –