}
std::shared_ptr<Derived> m_derived{std::make_shared<Derived>()};
};
foo(std::static_pointer_cast<Base>(m_derived));
Могу ли я в таком случае полагаться на корректную работу метода? Скастованный к Base объект умрет в момент выполнения foo, хотя физически в памяти он останется (как Base часть от Derived класса, являющегося полем Bar). Поэтому все должно быть ок, никаких seg fault, верно?
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Что значит «умрет, но останется в памяти»?
shared_ptr содержит указатель на контрольный блок и указатель на объект. shared_ptr с разными типами могут иметь указатель на один контрольный блок, поэтому все будет нормально в обычных случаях
Когда вы создадите указатель на базовый класс, он увеличит тот же счётчик, который управляет оригинальным обьектом
Все хорошо будет, короче :)
Что то тут не все, это даже не компилится
Rvalue не может быть подан в метод требующий ссылку.
Я псевдокод накидал, могу на онлайн компиляторе скинуть рабочий пример
По этому примеру вообще ничего нельзя сказать это не компилируемый код - да, так писать нельзя. Это работать не будет. Нужен нормальный пример отражающий реальный вопрос.
а это вообще компилируется?
тут создается временный объект, а вы его передаете в функцию, принимающую lvalue reference. Если бы была const reference, то все было бы ок с методом foo, потому что временный объект привяжется к константной ссылке, которая продлит его время жизни на время foo
Кстати, да. Вопрос невалиден, у нас же не даст в lvalue ref подать rvalue, так что ситуация невозможна
Да, уже понял, спасибо, чет я под вечер туплю
в const lvalue ref можно, но всё будет ок
Да, там лайтайм продлится, это уже неинтересно)
Обсуждают сегодня