std::move 于 std::vector 类型的 std::Optional

问题描述 投票:0回答:1

std::move
上执行
std::optional<std::vector<int>>
安全吗?它没有给我任何编译器或运行时错误,但想知道这是否有效。这是我的示例代码片段。

std::optional<std::vector<int>> from;
// do computation...
auto to = std::move(from);
// do computation...
c++ c++17
1个回答
0
投票

代码完全有效。

std::optional
有一个有效的移动构造函数(数字(3)),
std::vector
(数字(8))也是如此。

其结果将是:

  1. to
    将包含来自
    vector
    optional
    中的
    from
    的数据。
  2. 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

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.