Учитывая приведенный ниже код, он выдаст предупреждение:
предупреждение: временная привязка к 'Foo::b' сохраняется только до выхода из конструктора [-Wextra]
struct Bar {
inline void print() const { std::cout << "Bar" << std::endl; }
};
struct Foo {
Foo() : b{} {} // create temporary
void print() const { b.print(); } // OK but I'm expecting a crash here
Bar&& b;
};
Foo f; // Expecting lifetime of temporary ends here
f.print(); // OK - prints "Bar"
Я ожидаю, что доступ к Bar::print()
через Foo::b
приведет к сбою после выхода из конструктора Foo
.
Почему программа до сих пор вызывает Bar::print()
без сбоя?
Bar&& b;
висячим указателем? - person Joseph D.   schedule 25.04.2018Bar
не является полиморфным и не имеет элементов данных, ссылка не на что указывает, оборванная или нет. Почему компилятор должен создавать различие между действительной ссылкой на ничто и оборванной ссылкой на ничто? Он не обязан создавать сбой только потому, что мог. - person TrentP   schedule 25.04.2018Bar::print()
не имеет доступа ни к одному члену. При всем том, это неопределенное поведение. - person Scheff's Cat   schedule 25.04.2018int *p = nullptr, &r = *p;
r
является ссылкой на... (как мне это назвать?) ...несуществующий экземпляр. - person Scheff's Cat   schedule 25.04.2018nullptr
). Но это может произойти так же, как и деление на 0 (что, вероятно, редко делается намеренно). - person Scheff's Cat   schedule 25.04.2018Bar
не полиморфен, если он полиморфен, имеет ли это значение? - person Joseph D.   schedule 25.04.2018Bar::print()
был виртуальным методом, можно было бы создать код, который, скорее всего, вызвал бы сбой при вызове висячей ссылки. - person TrentP   schedule 25.04.2018