Promise then
возвращает promise object
, а не promise's resolved value
. Я разветвил JSFiddle и добавил некоторые из моих попробовать это .
promise.then
выполняется сразу после этого promise object
.
Хотя Base
и Derived
являются ковариантными и необработанные указатели на них будут действовать соответственно, shared_ptr<Base>
и shared_ptr<Derived>
не являются не ковариантными. dynamic_pointer_cast
является правильным и простым способом решения этой проблемы.
( Редактировать: static_pointer_cast
было бы более уместно, потому что вы проводите от производной к базовой, что безопасно и не требует проверок во время выполнения. См. Комментарии ниже.)
Однако, если ваша функция foo()
не желает участвовать в продлении срока службы (или, скорее, участвовать в общем владении объектом), то лучше всего принять const Base&
и разыменовать shared_ptr
] при передаче его на foo()
.
void foo(const Base& base);
[...]
shared_ptr<Derived> spDerived = getDerived();
foo(*spDerived);
Кроме того, поскольку типы shared_ptr
не могут быть ковариантными, правила неявного преобразования через ковариантные типы возвращаемых данных не применяются при возврате типов shared_ptr<T>
.