为什么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中只有非常量复制构造函数的类型?的主要内容,如果未能解决你的问题,请参考以下文章