Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';t std::可选允许为“移动”分配;“仅移动构造和复制指定”;类型?_C++_C++17_Move Semantics_Stdoptional - Fatal编程技术网

C++ 为什么';t std::可选允许为“移动”分配;“仅移动构造和复制指定”;类型?

C++ 为什么';t std::可选允许为“移动”分配;“仅移动构造和复制指定”;类型?,c++,c++17,move-semantics,stdoptional,C++,C++17,Move Semantics,Stdoptional,标准要求可选的移动分配运算符 constexpr optional& operator=( optional&& other ) […]不得参与过载解决,除非 是否可移动\u可构造\u v为真,是否可移动\u可分配\u v为真 可选值的赋值lhs=rhs也可以 销毁lhs(如果bool(lhs)和&!bool(rhs)) 建造lhs自rhs(如果!bool(lhs)和&bool(rhs))或 将rhs分配给lhs(如果bool(lhs)和&bool(rhs)) 因此

标准要求
可选
的移动分配运算符

constexpr optional& operator=( optional&& other )
[…]不得参与过载解决,除非
是否可移动\u可构造\u v
为真,
是否可移动\u可分配\u v
为真

可选值的赋值
lhs=rhs也可以

  • 销毁
    lhs
    (如果
    bool(lhs)和&!bool(rhs)
  • 建造
    lhs
    rhs
    (如果
    !bool(lhs)和&bool(rhs)
    )或
  • rhs
    分配给
    lhs
    (如果
    bool(lhs)和&bool(rhs)
因此,对于
可选
的移动分配,有两组先决条件是一种选择:

  • 是否可移动\u可构造\u v&&is\u移动\u可分配\u v
  • 可移动、可构造、可复制、可分配吗
  • 如果
    bool(lhs)和&bool(rhs)
    ,则第二个表单可以使用复制赋值,但如果
    ,则移动构造!布尔(左侧)和布尔(右侧)

    我认为,就以下两类类型而言,当前的一系列先决条件存在一个公认的相当人为的问题:

  • 不可移动可分配但可复制可分配、可移动可构造和可复制可构造的类型不能从分配时的移动构造中获益,即使构造是分配操作的一部分。将选择
    可选的
    复制赋值运算符,并复制构造或复制赋值

  • 不能分配既不可复制构造也不可移动分配但可移动构造和可复制分配的类型

  • 这是否是标准化过程中考虑的
    可选的
    ,或者没有考虑或放弃的理由


    (免责声明:我知道,<代码> iSyMeVieApdiaby通常是正确的,如果<代码> iSycopyApabsive是true,除非明确地删除了移动赋值运算符。)< /P> < P>您应该考虑使用可移动的可构造类型(第二种情况)

    是可移动的可构造的&&is\u移动的可分配的&&is\u移动的可分配的&=is\u移动的可构造的&&is\u复制的可分配的
    ,所以不需要它。如图所示,只要不删除复制赋值运算符,隐式删除的移动赋值运算符仍然是可移动赋值的。为什么要显式删除移动操作,但允许复制?如果问题真的是人为的,正如您所承认的,那么,对于标准来说,通过强制库实现者有时使用复制分配操作符而不是移动分配操作符来增加库实现者所需的工作量是没有意义的。或者,在这个问题上,通过编码这个要求来使标准本身复杂化。如果你有一个类型是copy-{construct,assign}able但不是move-{construct,assign}able,你在做一些非常奇怪的事情,我不确定是否值得让库复杂化来支持这样的事情。一般来说,图书馆对可复制但不可移动的令人憎恶的东西毫不在意。