Только что пришло от is_assignable и std :: unique_ptr .@Angew говорит мне, что, поскольку std::unique_ptr<int, do_nothing>
и std::unique_ptr<int>
- это разные типы, поэтому static_assert(not std::is_assignable<std::unique_ptr<int>, std::unique_ptr<int, do_nothing>>::value, "");
.Итак, я попытался:
template<typename T, typename D>
struct MoveAssignOnly_V2
{
MoveAssignOnly_V2&
operator=(MoveAssignOnly_V2&)
= delete;
MoveAssignOnly_V2&
operator=(MoveAssignOnly_V2&&) noexcept
{}
};
int main()
{
static_assert(not std::is_assignable_v<MoveAssignOnly_V2<int, float>,
MoveAssignOnly_V2<int, double>>);
}
Да, потому что MoveAssignOnly_V2<int, float>
и MoveAssignOnly_V2<int, double>
- это два разных типа, поэтому они не присваиваются.
Но , когда я добавляю ctor хода:
template<class U, class E>
MoveAssignOnly_V2(MoveAssignOnly_V2<U, E>&& m) noexcept {}
static_assert
fail! (как gcc, так и clang).
Вопрос здесь: почему конструктор перемещения влияет на is_assignable?
Обновлено
Причина, по которой я добавляю этот конструктор, состоит в том, что я обнаружил, что std::unique_ptr
имеет
template< class U, class E >
unique_ptr( unique_ptr<U, E>&& u ) noexcept;
, что меня немного смущает: как это может быть невозможно назначить сейчас, когда у него есть такой ctor?поэтому я попытался добавить такой ctor к MoveAssignOnly_V2
и опубликовать этот вопрос.Эти два ответа хороши, однако, все еще не может объяснить, почему std::unique_ptr
нельзя назначить, когда у него есть и назначение перемещения, и этот шаблонный конструктор.