gpt4 book ai didi

c++ - 为什么移动构造函数会影响 is_assignable?

转载 作者:太空狗 更新时间:2023-10-29 20:20:06 25 4
gpt4 key购买 nike

刚刚来自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>是两种不同的类型,因此它们不可分配。

但是,当我添加一个移动构造函数时:

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当它同时具有移动赋值和此模板化构造函数时不可赋值。

最佳答案

拿这段代码:

MoveAssignOnly_V2<int, float> lhs;
MoveAssignOnly_V2<int, double> rhs;
lhs = stdL::move(rhs);

当转换构造函数(注意它不是移动构造函数)不存在时,无法分配 rhs进入lhs .

但是,当您添加构造函数模板时,现在有一种方法可以将 rhs 转换为入式MoveAssignOnly_V2<int, float> (创建该类型的临时文件)。然后,可以从那个临时移动分配到 lhs .

这与以下原理相同:

double lhs = 3.14;
float rhs = 42.f;
lhs = std::move(rhs);

解决问题中的更新:

你不能单独使用函数声明,你必须阅读完整的规范(在标准或 suitable reference 中)。引用有关 std::unique_ptr 的转换构造函数的链接引用:

This constructor only participates in overload resolution if all of the following is true:

a) unique_ptr<U, E>::pointer is implicitly convertible to pointer
b) U is not an array type
c) Either Deleter is a reference type and E is the same type as D, or Deleter is not a reference type and E is implicitly convertible to D

如您所见,unique_ptr必须实现转换构造函数,以便只有在源删除器可以转换为目标删除器时它才处于事件状态。这与上一个问题中的移动分配规则基本相同。

关于c++ - 为什么移动构造函数会影响 is_assignable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53885538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com