Я был довольно удивлен, узнав, что конструктор перемещения (и назначение в этом отношении) std::optional
не сбрасывает необязательный перемещенный из него, как видно из [19.6.3.1/7], в котором говорится: "bool (rhs) без изменений ".
Это также можно увидеть по следующему коду:
#include <ios>
#include <iostream>
#include <optional>
#include <utility>
int main() {
std::optional<int> foo{ 0 };
std::optional<int> bar{ std::move(foo) };
std::cout << std::boolalpha
<< foo.has_value() << '\n' // true
<< bar.has_value() << '\n'; // true
}
Это, по-видимому, противоречит другим примерам перемещения в стандартной библиотеке, например, с std::vector
котором перемещенный контейнер обычно сбрасывается каким-либо образом (в случае вектора, который, как гарантируется, будет пустым впоследствии), чтобы "аннулировать" его, даже если объекты, содержащиеся в нем сами, уже перемещены. Есть ли какая-либо причина для этого или потенциального прецедента, которое должно принять такое решение, например, возможно, пытающееся имитировать поведение не факультативной версии того же типа?