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

标签 c++ c++17 move-semantics stdoptional

标准要求 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/

相关文章:

用于套接字的 C++ 迭代器外观

c++ - 无法在 CMake 项目中使用 Q_OBJECT 宏

c++ - 比较是否相等时可以使用 `==` 吗?

c++ - 是否有用于 x86 的良好 double 小型矩阵 SIMD 库?

c++ - 存储在类中的闭包中通过引用捕获的临时对象的生命周期

c# - C++ 17 中的 std::byte 是否等同于 C# 中的字节?

c++ - 模板化虚拟函数替代品

C++ 模板函数中的左值和右值

c++ - 用 malloc'ed char 数组替换 std::vector 的缓冲区

c++ - 我可以调整从中移出的 vector 的大小吗?