【发布时间】:2018-12-21 13:23:50
【问题描述】:
刚来自is_assignable and 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 在同时具有移动赋值和这个模板化构造函数时是不可赋值的。
【问题讨论】:
标签: c++ assignment-operator move-constructor