在
std::move
上执行 std::optional<std::vector<int>>
安全吗?它没有给我任何编译器或运行时错误,但想知道这是否有效。这是我的示例代码片段。
std::optional<std::vector<int>> from;
// do computation...
auto to = std::move(from);
// do computation...
std::optional
有一个有效的移动构造函数(数字(3)),std::vector
(数字(8))也是如此。
其结果将是:
to
将包含来自 vector
optional
中的 from
的数据。from
仍将包含 vector
,但由于它被移出,它将处于 有效但未指定的状态(请参阅更多信息此处)。下面的代码演示了类似的场景(使用自定义类
A
):
#include <optional>
#include <iostream>
#include <iomanip>
struct A
{
A() { std::cout << "Constructing A\n"; }
A(A const&) { std::cout << "Copy constructing A\n"; }
A(A&&) { std::cout << "Move constructing A\n"; }
A& operator=(A const&) { std::cout << "Copy assigning A\n"; return *this; }
A& operator=(A&&) { std::cout << "Move assigning A\n"; return *this; }
~A() { std::cout << "Destructing A\n"; }
};
int main()
{
std::optional<A> from;
from.emplace();
auto to = std::move(from);
std::cout << "`from` has value: " << std::boolalpha << from.has_value() << std::endl;
}
输出:
Constructing A
Move constructing A
`from` has value: true
Destructing A
Destructing A