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

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 完全一样。