为什么 std::reference_wrapper 显式定义了复制赋值运算符?

Ria*_*inn 3 c++

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

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

只是想了解一下为什么委员会觉得有必要这样做的历史。

Max*_*kin 5

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

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


Ast*_*ngs 5

他们宣布这一点是因为它还有工作要做。

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

这并不意味着 astd::reference_wrapper不可移动,只是意味着“移动”a 与复制它相同。而且实施两次是没有意义的!