【问题标题】:Why does std::reference_wrapper explicitly define a copy assignment operator?为什么 std::reference_wrapper 显式定义复制赋值运算符?
【发布时间】:2020-06-18 01:57:43
【问题描述】:

std::reference_wrapper 显式声明了复制赋值运算符。为什么?这应该可以防止隐式定义移动构造/赋值,所以我的假设是他们不希望你移动 std::reference_wrapper,但我不确定为什么这很重要。

如果您查看“可能的实现”,他们只是默认操作员: https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/operator%3D

只是寻找一些关于委员会为什么认为有必要这样做的历史。

【问题讨论】:

标签: c++


【解决方案1】:

这应该可以防止隐式定义移动构造/赋值

std::reference_wrapper 是一个非拥有引用(实际上是一个指针),移动操作与复制没有什么不同。不要将其与std::shared_ptr 混淆。

【讨论】:

  • 我不是,真的在寻找更多为什么不添加 move 的原因。我的猜测是因为 reference_wrapper 只是一个指针,所以移动与副本相同。
【解决方案2】:

他们宣布它是因为它有工作要做。

是的,这会禁止自动生成的移动构造函数。不,那没关系。无论如何,作者都必须定义自己的(出于同样的原因,他们需要创建一个复制构造函数),除了“移动”不拥有资源的东西没有用处。这将与副本相同。

这并不意味着std::reference_wrapper 不可移动,它只是意味着“移动”一个与复制它是一样的。而且执行两次是没有意义的!

【讨论】:

  • 老实说,我认为这也是我能想到的最好的解释。到最后,移动就和副本一样了,就不用加了。
【解决方案3】:

std::reference_wrapper 是一个具有类引用语义的对象。但与内置引用不同,reference_wrapper 可以重新绑定、复制和移动。这允许它在标准容器中使用。所以我不明白你的困惑,根据其设计,reference_wrapper 应该是可复制和可移动的。

【讨论】:

  • 问题是为什么它不能移动。
  • 虽然可以使用移动,但实际上并没有移动,因为不可能进行隐式移动。
【解决方案4】:

考虑您期望从 std::reference_wrapper 移出的状态。如果您可以提供帮助,您不希望引用包装器引用不存在的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多