C++ 11移动语义和STL容器

inh*_*ank 4 c++ stl c++11

关于移动语义和容器:

  1. 我知道当元素类型中定义了移动操作时,STL容器会利用移动.但是它如何知道元素是否定义了移动操作?

  2. 为什么STL容器无论如何都不会在元素上调用std :: move(),无论元素是否定义了移动操作?我问这个是因为我知道你可以在对象上调用std :: move(),即使它的类型没有定义任何移动操作.

谢谢.

Tia*_*mes 8

长话短说,这正是他们所做的,std::move如果它能够移动或只是复制就不需要关心.

值得注意的是,一些提供强大异常保证的功能,例如std::vector::resize,将调用鲜为人知的std::move_if_nothrow而不是std::move.

  • 迂腐的评论:你的回答是正确的.然而,"大部分时间"调用`move_if_noexcept`而不是`move`"是不准确的.大多数情况下,不需要也不提供强大的异常保证.`vector`特别使用`move_if_noexcept`进行一些操作,例如`reserve`和`push_back`.我会称之为异常,而不是规则,特别是如果我们讨论所有std定义的容器.大多数情况下,标准需要基本的异常安全性,并由实现提供. (3认同)