Возвращаемое значение троичного выражения является общим типом обоих выражений (на самом деле std::common_type
может использовать троичный оператор как часть его реализации :-)).
В то время как std::unique_ptr<B>
и std::unique_ptr<C>
являютсянесвязанные типы,
и std::unique_ptr<B>
и std::unique_ptr<C>
могут быть преобразованы в std::unique_ptr<A>
, поэтому достаточно явно преобразовать один из них:
auto aptr = t ? std::unique_ptr<A>{std::make_unique<B>()}
: std::make_unique<C>();
Демо