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

4
关于移动语义和容器:
  1. 我知道STL容器在元素类型定义了移动操作时会利用它,但它如何知道一个元素是否已经定义了移动操作?
  2. 为什么STL容器不管元素是否定义了移动操作都调用std::move()呢?我问这个问题是因为我知道即使类型没有定义任何移动操作,也可以调用std::move()来移动对象。
谢谢。
1个回答

8

简单来说,他们会使用std::move,而不管它是否能够移动或仅仅是复制。

值得注意的是,一些提供强异常保证的函数(例如std::vector::resize)将调用较少人知道的std::move_if_nothrow而不是std::move


1
我认为这回答了我问题的两个部分:STL容器实际上并不检测元素的移动操作是否被定义,它们只是盲目地调用std::move_if_no_throw,然后使用重载解析来选择函数的移动或复制版本。如果我有什么误解,请随时纠正我。谢谢。 - inhwank
3
你的回答精神是正确的。然而,“大多数情况下调用move_if_noexcept而不是move”是不准确的。大多数情况下,不需要也没有提供强异常保证。特别是vector使用move_if_noexcept来进行一些操作,如reservepush_back。如果我们谈论所有std-defined容器,我会说这是例外而不是规则,尤其是在大多数情况下,基本的异常安全由标准要求并由实现提供。 - Howard Hinnant
@HowardHinnant 我同意你的评论。已经编辑了我的答案以反映这一点。谢谢! - Tiago Gomes
@TiagoGomes:现在我别无选择,只能给你的答案点赞了。;-) - Howard Hinnant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接