为什么std :: pair类标准被改为禁止在C ++ 11中只有非常量复制构造函数的类型?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么std :: pair类标准被改为禁止在C ++ 11中只有非常量复制构造函数的类型?相关的知识,希望对你有一定的参考价值。

我正在阅读Nicolai M. Josuttis的“The C ++标准库(第二版)”,刚刚到达std::pair的部分。作者指出:

从C ++ 11开始,使用仅具有非常量复制构造函数的类型的pair<>将不再编译。

然后他继续给出以下示例:

class A 
{
   public:
     ...
     A( A& ); // copy constructor with nonconstant reference
     ...
};

std::pair<A, int> p; // Error since C++11

但是,我对标准委员会决定对标准库标准进行修改的原因感兴趣吗?我试图谷歌的原因,但没有找到任何相关的东西。

答案

在C ++ 98中,具有非常量引用参数的复制构造函数将是(ab)used to "move" elements。众所周知,这种代码不安全且不清楚。臭名昭着的现在deprecated std::auto_ptr就是最好的例子。

在C ++ 11中,我们使用move semantics和rvalue引用来更安全和清晰地实现相同的效果。这是因为rvalue引用是对可变对象的引用,但它只能绑定到“安全”表达式,例如临时或您明确强制转换的事物(通过std::move),因此标记为一次性。

简而言之:带有非引用成员的复制构造函数的类没有真正的用例,使用rvalue引用无法做得更好更安全。 std::pair获得了一个移动构造函数std::pair(std::pair&&)=default来容纳这样的语义。

以上是关于为什么std :: pair类标准被改为禁止在C ++ 11中只有非常量复制构造函数的类型?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 std::pair 和 std::tuple

C++ 中的 std::pair 和 std::tuple

C++ 错误在模板类中声明 std::pair

Pair类模板

返回多于 T& 和 std::pair 的 iterator::operator* 的标准接口

为啥 std::pair 对于 const 引用和转发引用参数有两个不同的构造函数?