gpt4 book ai didi

c++ - 为什么 std::optional 不允许对 "move construct and copy assign only"类型进行 move 赋值?

转载 作者:行者123 更新时间:2023-11-30 04:49:52 26 4
gpt4 key购买 nike

标准要求 optional 的 move 赋值运算符...

constexpr optional& operator=( optional&& other )

[...] shall not participate in overload resolution unless is_move_constructible_v<T> is true and is_move_assignable_v<T> is true.

可选值的赋值lhs = rhs;要么

  • 销毁lhs (如果 bool(lhs) && !bool(rhs) )
  • 施工 lhs来自 rhs (如果 !bool(lhs) && bool(rhs) )或
  • 分配rhslhs (如果 bool(lhs) && bool(rhs) )。

因此,可以选择为 optional 的 move 分配设置两组先决条件:

  1. is_move_constructible_v<T> && is_move_assignable_v<T>
  2. is_move_constructible_v<T> && is_copy_assignable_v<T>

如果 bool(lhs) && bool(rhs),第二种形式可以使用复制赋值但如果 !bool(lhs) && bool(rhs) 则 move 施工.

对于以下两类类型,我发现当前的先决条件集存在一个公认的相当人为的问题:

  1. 不可 move 赋值但可复制赋值、可 move 构造和可复制构造的类型无法从赋值 move 构造中获益,即使构造是赋值操作的一部分。 optional将选择复制赋值运算符并复制构造或复制赋值。

  2. 既不可复制构造也不可 move 赋值但可 move 构造且可复制赋值的类型根本不能赋值。

optional 的标准化过程中是否考虑到了这一点?或者有什么理由不考虑或放弃它?

(免责声明:我知道如果 is_move_assignable 为真,则 is_copy_assignable 通常为真,除非明确删除 move 赋值运算符。)

最佳答案

您应该考虑使用 std::optional::emplace对于可 move 构造类型(第二种情况)

关于c++ - 为什么 std::optional 不允许对 "move construct and copy assign only"类型进行 move 赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55229833/

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