如何从标准::可选<T>移动
How to move from std::optional<T>
考虑下面的例子,我们解析数据并将结果传递给下一个函数:
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
异常(§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
异常根本不存在)。成员get()
只是operator*
的别名,并且总是依赖于用户检查optional
实例是否参与。
对于您当前的实现,答案是否定的。但如果您稍微更改它,您就可以移动值。optional的运算符*(以及方法value())有4个重载。其中只有2个返回右值引用(_Ty&和const_Ty&aamp;amp&和常量&。这意味着只有当您的可选变量本身被右值引用访问时,您才能使用它们。在这种情况下,实现应该看起来像:
std::optional<Content> Parse(const std::string& data);
void Process(Content content);
int main()
{
auto data = ReadData();
auto content = Parse(data);
if (content)
Process(*std::move(content));
}
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- EASTL矢量<向量<int>>连续的
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- SendInput()鼠标移动计算
- 按值 C++ 返回时进行双倍移动
- 移动二维数组中的字符
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 安全到标准:移动会员?