Проблема в том, что ссылка на A
в классе C
(т. Е. Элемент данных _a
) переживает объект, на который она ссылается. Это связано с тем, что временное B(12)
в вашей bar()
функции
void bar() {
v.emplace_back(B(12));
}
не существует после возврата из bar()
. Таким образом, ссылка на A
, содержащаяся в классе C
, становится висячей ссылкой .
Вместо временного вы можете создать объект B
сnew
оператор:
void bar() {
B* ptr = new B(12);
v.emplace_back(std::move(*ptr));
}
Этот B
объект не перестает существовать при возврате из bar()
, поэтому ссылка на A
в C
остается действительной.
Обратите внимание, что при таком подходе вам необходимо уничтожить объект вручную:
C&& c = std::move(v.front());
// ...
delete &c._a; // destroy object