将右值引用参数转换为右值引用?
Casting a rvalue reference parameter to a rvalue reference?
我目前正在尝试在我的代码中实现一个非常小的嵌套异常机制,因为 std::nested_exception
并非所有我必须用来编译我的代码的编译器都可用。
我在 gcc implementation source code 中发现了以下有用的嵌套包装器:
template<typename _Except>
struct _Nested_exception : public _Except, public nested_exception
{
explicit _Nested_exception(_Except&& __ex)
: _Except(static_cast<_Except&&>(__ex))
{ }
};
允许将已抛出的异常与 throw_with_nested
中的 nested_exception
class 结合起来,这样就可以 dynamic_cast
来测试我们是否已经抛出了异常caught实际上是一个嵌套的异常或不是后来的。
我不明白的是这里的static_cast
。我想我遗漏了一些关于移动语义的东西,真的需要吗?
虽然 __ex
是一个 _Except&&
,但一旦您进入此范围,__ex
就是一个左值 - 它是一个局部变量。为了强制在 _Except
内部使用移动构造函数,他们 _Except(static_cast<_Except&&>(__ex))
强制 __ex
成为一个右值(它实际上可能是一个 xvalue)。
移动语义意味着我们知道调用此构造函数时使用的参数是临时的(或将被移动的对象)。我们在 __ex
的类型中看到了这一点,即 _Except&&
。然而,如果我们在这个构造函数中使用 __ex
,它将被视为左值——它显然有一个名字,我们可以获取它的地址。
如果您想将 __ex
传递给任何进一步的 functions/constructors,则需要恢复它的右值性。这样做的正常方法是调用 std::move(__ex)
,它将 &&
重新应用到 __ex
的类型。这与您在上面看到的 static_cast
完全一样。
我目前正在尝试在我的代码中实现一个非常小的嵌套异常机制,因为 std::nested_exception
并非所有我必须用来编译我的代码的编译器都可用。
我在 gcc implementation source code 中发现了以下有用的嵌套包装器:
template<typename _Except>
struct _Nested_exception : public _Except, public nested_exception
{
explicit _Nested_exception(_Except&& __ex)
: _Except(static_cast<_Except&&>(__ex))
{ }
};
允许将已抛出的异常与 throw_with_nested
中的 nested_exception
class 结合起来,这样就可以 dynamic_cast
来测试我们是否已经抛出了异常caught实际上是一个嵌套的异常或不是后来的。
我不明白的是这里的static_cast
。我想我遗漏了一些关于移动语义的东西,真的需要吗?
虽然 __ex
是一个 _Except&&
,但一旦您进入此范围,__ex
就是一个左值 - 它是一个局部变量。为了强制在 _Except
内部使用移动构造函数,他们 _Except(static_cast<_Except&&>(__ex))
强制 __ex
成为一个右值(它实际上可能是一个 xvalue)。
移动语义意味着我们知道调用此构造函数时使用的参数是临时的(或将被移动的对象)。我们在 __ex
的类型中看到了这一点,即 _Except&&
。然而,如果我们在这个构造函数中使用 __ex
,它将被视为左值——它显然有一个名字,我们可以获取它的地址。
如果您想将 __ex
传递给任何进一步的 functions/constructors,则需要恢复它的右值性。这样做的正常方法是调用 std::move(__ex)
,它将 &&
重新应用到 __ex
的类型。这与您在上面看到的 static_cast
完全一样。