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

标签 c++ c++11 copy-constructor move-semantics

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

Since C++11, a pair<> using a type that has only a nonconstant copy constructor will no longer compile.

然后他继续举了下面的例子:

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和右值引用以更安全、更清晰地实现相同的效果。这是因为右值引用是对可变对象的引用,但它只能绑定(bind)到“安全”表达式,例如临时变量或您已显式转换(通过 std::move)的事物,因此标记为一次性。

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

关于c++ - 为什么 std::pair 类标准更改为不允许在 C++11 中仅具有非常量复制构造函数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16616266/

相关文章:

c++ - 制作一个 const unique_ptr 然后尝试从它 std::move 给出相同的错误,就好像您试图访问复制构造函数一样

c++ - 将批处理输出传递给 exe

c++ - 如何将 map 和 unordered_map 作为同一个对象来处理

c++ - 存储指针时 auto 和 auto* 的区别

c++ - 以字符串列表作为模板参数的模板静态类,如何在C++ 11上制作

c++ - 这段代码不应该根据标准中的 12.8p2 编译吗?

c++ - visual studio 2010 c++ 加载时间

c++ - 使用最小操作将给定字符串转换为排序字符串

c++ - "hide"通过在派生类中将基类虚函数设为纯虚函数是否有效?

基于策略的设计中的 C++ 复制/移动构造函数