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