繁体   English   中英

将右值引用参数转换为右值引用?

[英]Casting a rvalue reference parameter to a rvalue reference?

我目前正在尝试在我的代码中实现一个非常小的嵌套异常机制,因为std::nested_exception不适用于所有我必须用来编译代码的编译器。

我在gcc实现源代码中遇到了以下有用的嵌套包装器:

template<typename _Except>
struct _Nested_exception : public _Except, public nested_exception
{
    explicit _Nested_exception(_Except&& __ex)
    : _Except(static_cast<_Except&&>(__ex))
    { }
};

它允许已抛出同一个异常结合nested_exceptionthrow_with_nested这样一方面可以dynamic_cast测试,我们已经捕捉到的异常是否实际上是嵌套异常或没有以后。

我不明白的是这里的static_cast 我想我缺少关于移动语义学的东西,真的需要吗?

尽管__ex_Except&& ,但是一旦输入此范围, __ex就是一个左值-它是一个局部变量。 为了在_Except内部强制使用move构造函数,他们会执行_Except(static_cast<_Except&&>(__ex))来强制__ex成为右值(实际上可能是xvalue)。

移动语义意味着我们知道该构造函数已使用一个临时参数(或将要移出的对象)进行了调用。 我们以__ex的类型_Except&&看到了这一点。 但是,如果要在此构造函数中使用__ex ,它将被视为左值-显然有一个名称,我们可以使用它的地址。

如果要将__ex传递给任何其他函数/构造函数,则需要恢复其右值。 通常的方法是调用std::move(__ex) ,它将&&重新应用于__ex类型。 这实际上就是您在上面看到的相同的static_cast

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM