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

Tho*_*ell 5 c++ copy-constructor move-semantics 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
Run Code Online (Sandbox Code Playgroud)

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

Tem*_*Rex 4

在 C++98 中,具有非常量引用参数的复制构造函数将被(滥用)用于“移动”元素。众所周知,此类代码不安全且不明确。臭名昭著且现已弃用的std::auto_ptr就是最好的例子。

在 C++11 中,我们使用移动语义和右值引用来更安全、更清晰地实现相同的效果。这是因为右值引用是对可变对象的引用,但它只能绑定到“安全”表达式,例如临时变量或您已显式转换(通过std::move)并因此标记为一次性的东西。

简而言之:具有采用非引用成员的复制构造函数的类没有真正的用例,不能使用右值引用更好、更安全地完成这些用例。std::pair获得了一个移动构造函数std::pair(std::pair&&)=default来适应这种语义。