【问题标题】:C++ 11 Move Semantics and STL ContainersC++ 11 移动语义和 STL 容器
【发布时间】:2023-03-26 08:37:01
【问题描述】:

关于移动语义和容器:

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

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

谢谢。

【问题讨论】:

    标签: c++ c++11 stl


    【解决方案1】:

    长话短说,他们就是这样做的,打电话给std::move,而不关心它是否能够移动或只是复制。

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

    【讨论】:

    • 我认为这回答了我的问题的两个部分:STL 容器 实际上检测元素的移动操作是否已定义,它们只是盲目地调用 std: :move_if_no_throw 无论如何,然后使用重载决议来选择函数的移动或复制版本。如果我误解了什么,请随时纠正我。谢谢。
    • 迂腐评论:您的回答精神是正确的。然而,“大多数时候调用move_if_noexcept 而不是move”是不准确的。大多数时候,不需要也不需要提供强大的异常保证。 vector 尤其将move_if_noexcept 用于一些操作,例如reservepush_back。我将其称为例外,而不是规则,尤其是当我们谈论所有标准定义的容器时。大多数时候,标准要求基本的异常安全,并由实现提供。
    • @HowardHinnant 我同意你的评论。编辑我的答案以反映它。谢谢!
    • @TiagoGomes:现在我别无选择,只能投票给你的答案。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2014-07-19
    • 2017-09-10
    • 2012-10-07
    • 2014-08-16
    • 2019-01-02
    相关资源
    最近更新 更多