Поскольку list1
является вектором Base*
, функция push_back
в списке будет ожидать параметр типа Base* const&
, в то время как ваш новый предоставляет Derived*
. Для передачи по ссылке (как требуется в push_back
) компилятору нужен фактический объект ссылочного типа, в данном случае Base*
. Существует доступное неявное преобразование из Derived*
в Base*
, которое компилятор использует для создания временного объекта типа Base*
для передачи в push_back
, и компилятор предупреждает вас о том, что он создает этот временный объект.
Причина, по которой он работает, когда вы присваиваете его переменной, заключается в том, что больше не требуется неявная временная необходимость: он может неявно преобразовывать именованную переменную в Base*
неявно и передавать эту ссылку внутрь.
Я думаю, что вы можете отключить это предупреждение, сказав push_back, что указатель обрабатывается как Base*
:
list1.push_back(static_cast<Base*>(new Derived));