为什么在c++ 11中将std::pair类标准更改为不允许只有非常量复制构造函数的类型?

Why was the std::pair class standard changed to disallow types with only a nonconstant copy constructor in C++11?

本文关键字:常量 非常 不允许 复制 类型 构造函数 中将 c++ std pair 标准      更新时间:2023-10-16

我正在通读Nicolai M. Josuttis的《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)用于"移动"元素。这样的代码是出了名的不安全和不清晰。臭名昭著的、现在已被弃用的std::auto_ptr就是最好的例子。

在c++ 11中,我们有移动语义和右值引用来更安全、更清晰地实现相同的效果。这是因为右值引用是对可变对象的引用,但它只能绑定到"安全"表达式,例如临时表达式或您(通过std::move)显式强制转换的内容,因此标记为可丢弃的。

简而言之:复制构造函数接受非引用成员的类没有不能用右值引用更好、更安全的实际用例。std::pair获得了一个move构造函数std::pair(std::pair&&)=default来适应这种语义。