考虑以下示例,我们解析数据并将结果传递给下一个函数:
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/