在什么条件下我应该考虑实现移动构造函数和移动运算符?

kfm*_*e04 7 c++ constructor rvalue-reference c++11

对于标准的拷贝构造函数和赋值运算符delete,如果我的类实现了析构函数,我总是考虑实现它们或者使用默认值.

对于新移动构造函数移动运算符,考虑是否需要实现的正确方法是什么?

作为从前C++ 0x转换系统的第一步,我可以只是delete默认的移动构造函数移动运算符,还是应该让它们单独存在?

Ste*_*sop 10

你不必担心它,在这个意义上,当你的用户声明析构函数(或任何在12.8/9其他上市),该块生成的默认移动构造函数.因此,与副本的风险不同,默认是错误的.

所以,作为第一关,让他们独自一人.现有代码中可能存在C++ 11移动语义允许移动的位置,而C++ 03则指示副本.你的类将继续被复制,如果这在C++ 03中没有引起任何性能问题,那么我无法立即想到它在C++ 11中的原因.如果它确实导致了C++ 03中的性能问题,那么你有机会修复你以前从未遇到的代码中的错误,但这是一个机会,而不是义务;-)

如果你以后实现移动构造和赋值,它们将被移动,特别是如果你认为你的类的C++ 11客户端不太可能使用"swaptimization"来避免拷贝,那么你会想要这样做,更有可能通过值等传递您的类型,而不是C++ 03客户端.

在C++ 11中编写新类时,需要根据swap在C++ 03中考虑和实现的相同条件来考虑和实现移动.一个可以复制的类实现了C++ 11的"可移动"概念,(就像可以在C++ 03中复制的类可以通过默认实现进行交换std),因为"可移动"并没有说资源留在哪个州 - 特别是允许保持不变.所以副本作为移动有效的,它不一定是有效的,对于许多类,你会发现,与"好"移动或交换不同,副本可以抛出.

您可能会发现,如果您有析构函数(因此没有默认的移动构造函数),您必须为您的类实现move,并且您还有一个可移动但不可复制的数据成员(因此也没有默认的复制构造函数).这就是移动在语义和性能上变得重要的时候.