【发布时间】:2023-03-26 08:37:01
【问题描述】:
关于移动语义和容器:
我知道 STL 容器在元素类型中定义移动操作时会利用移动。但是它如何知道一个元素是否定义了移动操作呢?
为什么不管元素是否定义了移动操作,STL 容器都不直接在元素上调用 std::move() ?我问这个是因为我知道你可以在对象上调用 std::move() ,即使它的类型没有定义任何移动操作。
谢谢。
【问题讨论】:
关于移动语义和容器:
我知道 STL 容器在元素类型中定义移动操作时会利用移动。但是它如何知道一个元素是否定义了移动操作呢?
为什么不管元素是否定义了移动操作,STL 容器都不直接在元素上调用 std::move() ?我问这个是因为我知道你可以在对象上调用 std::move() ,即使它的类型没有定义任何移动操作。
谢谢。
【问题讨论】:
长话短说,他们就是这样做的,打电话给std::move,而不关心它是否能够移动或只是复制。
值得注意的是,一些提供强异常保证的函数,例如std::vector::resize,将调用鲜为人知的std::move_if_nothrow,而不是std::move。
【讨论】:
move_if_noexcept 而不是move”是不准确的。大多数时候,不需要也不需要提供强大的异常保证。 vector 尤其将move_if_noexcept 用于一些操作,例如reserve 和push_back。我将其称为例外,而不是规则,尤其是当我们谈论所有标准定义的容器时。大多数时候,标准要求基本的异常安全,并由实现提供。