c++ - 如何从 std::optional<T> 移动

标签 c++ std c++14 boost-optional

考虑以下示例,我们解析数据并将结果传递给下一个函数:

Content Parse(const std::string& data);
void Process(Content content);

int main()
{
    auto data = ReadData();
    Process(Parse(data));    
}

现在让我们使用 std::optional 更改代码处理失败的解析步骤:

optional<Content> Parse(const std::string& data);
void Process(Content content);

int main()
{
    auto data = ReadData();
    auto content = Parse(data);
    if (content)
        Process(move(*content));
}

optional<T>::value() 移出是否有效?如果 std::optional 没问题|对 boost::optional 有效吗?也一样?

最佳答案

optional<T>::value() 移动有效因为它返回一个可变引用并且移动不会破坏对象。如果 optional实例未参与value()将抛出 bad_optional_access异常(exception)(第 20.6.4.5 节)。

您明确检查该选项是否已启用:

if (content)
    Process(move(*content));

但你不使用成员 value()访问底层 T .请注意 value()在返回有效 T& 之前在内部执行检查, 不像 operator*它有一个前提,即optional应聘用实例。这是一个微妙的区别,但你使用正确的成语:

if (o)
  f(*o)

相对

if (o)  // redundant check
  f(o.value())

在 Boost 中,情况有点不同:首先,不存在名为 value() 的成员函数。提供检查访问。 (一个 bad_optional_access 异常(exception)根本不存在)。成员(member)get()只是 operator* 的别名并且始终依赖于用户检查 optional实例已启用。

关于c++ - 如何从 std::optional<T> 移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17502564/

相关文章:

c++ - 将整数行读入 vector

c++ - 如何在C++程序中随机生成 'a-z'和 'A-Z'?

C++ - 将 unsigned char* 复制到新的 unsigned char* 数组

c++ - 删除 Windows 库依赖项

C++14:具有通用 std::function 作为类成员的通用 lambda

c++ - 如何按级别顺序构造二叉树

c++ - ofstream中可以设置 "eof"吗?

c++: std::bind() 'know' 模板参数是指静态函数还是成员函数?

c++ - 如果 T 是一个函数,不要对 T 使用 sizeof

c++ - lambda 是如何 move 的?