5

我正在阅读 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

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

4

1 回答 1

4

在 C++98 中,具有非常量引用参数的复制构造函数将(ab)用于“移动”元素。这样的代码是出了名的不安全和不清楚。臭名昭著且现已弃用std::auto_ptr的就是最好的例子。

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

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

于 2013-05-17T20:04:17.957 回答