C++ 是否将右值引用参数强制转换为右值引用?

C++ 是否将右值引用参数强制转换为右值引用?,c++,c++11,casting,rvalue-reference,C++,C++11,Casting,Rvalue Reference,我目前正试图在我的代码中实现一个非常小的嵌套异常机制,因为std::nested_exceptions不适用于我必须编译代码的所有编译器 我在中遇到了以下有用的嵌套包装器: 模板 结构嵌套异常:公共嵌套异常,公共嵌套异常 { 显式嵌套异常(&&uuuuuuex除外) :_除外(静态_转换(_ex)) { } }; 它允许将已抛出的异常与throw\u with\u nested中的nested\u exception类结合起来,这样就可以dynamic\u cast来测试我们捕获的异常是否真的

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

我在中遇到了以下有用的嵌套包装器:

模板
结构嵌套异常:公共嵌套异常,公共嵌套异常
{
显式嵌套异常(&&uuuuuuex除外)
:_除外(静态_转换(_ex))
{ }
};
它允许将已抛出的异常与
throw\u with\u nested
中的
nested\u exception
类结合起来,这样就可以
dynamic\u cast
来测试我们捕获的异常是否真的是嵌套异常


我不明白的是这里的
静态\u cast
。我想我遗漏了一些关于移动语义的东西,它真的需要吗?

虽然
\uuuuex
是一个
\u,除了&&
,但一旦你进入这个范围
\uuuuuex
是一个左值-它是一个局部变量。为了在
\u Except
内部强制使用move构造函数,它们会强制
\u Except(static_cast(\uu ex))
\uu ex
变成右值(它可能实际上是一个x值)。

尽管
\uu ex
是一个
\u Except&
,一旦你进入这个范围,它就是一个左值-它是一个局部变量。为了在
\u Except
中强制使用move构造函数,它们使用
\u Except(static_cast(\uuu ex))
强制
\uu ex
成为右值(它可能实际上是一个xvalue)。

移动语义意味着我们知道调用此构造函数时使用了一个临时(或从对象中移动)的参数. 我们在
\uuuuuex
类型中看到了这一点,它是
\u,除了&
。然而,如果我们在这个构造函数中使用
\uuuu ex
,它将被视为左值-它显然有一个名称,我们可以获取它的地址


如果要将
\uuuuex
传递给任何其他函数/构造函数,则需要恢复其右值。通常的方法是调用
std::move(\uuuu-ex)
,这将对
\uu-ex
类型重新应用
&
。这实际上与您在上面看到的
static\u cast
完全相同。

移动语义意味着我们知道已使用临时(或要从对象中移动)参数调用此构造函数。我们在
\uuuuuex
类型中看到了这一点,它是
\u,除了&
。然而,如果我们在这个构造函数中使用
\uuuu ex
,它将被视为左值-它显然有一个名称,我们可以获取它的地址


如果要将
\uuuuex
传递给任何其他函数/构造函数,则需要恢复其右值。通常的方法是调用
std::move(\uuuu-ex)
,这将对
\uu-ex
类型重新应用
&
。这与您在上面看到的
static\u cast
完全相同。

static\u cast实际上相当于
转发(\uuuuu ex)
@Columbo是的,但这不是一个完美转发的例子,因为
\uu ex
的类型永远不会被推断出来。这更像是
std::move(\uuuuuex)
@jepio是否推断出
\u除外
是不相关的-尽管如此,我的陈述仍然有效。没有人提到完美转发。@Columbo它是有效的,因此我写了是的,但是
forward
用于完美转发,因此您暗中提到了它。该强制转换的语义是调用
std::move
,对于右值,它与
std::forward
相同。
static\u强制转换
实际上相当于
forward(\uuuuuuuuu-ex)
@Columbo是的,但这不是一个完美转发的例子,因为
\uuu-ex
的类型永远不会被推断出来。这更像是
std::move(\uuuuuex)
@jepio是否推断出
\u除外
是不相关的-尽管如此,我的陈述仍然有效。没有人提到完美转发。@Columbo它是有效的,因此我写了是的,但是
forward
用于完美转发,因此您暗中提到了它。该强制转换的语义是调用
std::move
,对于右值,它与
std::forward
相同。我知道,我想我在某个地方看到过这一点,但忘记了它,因为我没有太多地使用移动语义,一旦我们进入函数,它就被命名,因此是一个左值。谢谢更清楚的是:rvalue参数类型意味着传入的原始值作为rvalue传递,但在函数中,变量_ex是一个左值。您可以强制转换,或者最好使用
std::move
(虽然它通常是作为强制转换实现的)我知道,我想我已经在某个地方看到过这一点,但是忘记了它,因为我没有太多地使用移动语义,一旦我们进入函数,它就被命名,因此是一个左值。谢谢更清楚的是:rvalue参数类型意味着传入的原始值作为rvalue传递,但在函数中,变量_ex是一个左值。您可以强制转换或最好使用
std::move
(尽管它通常作为强制转换实现)谢谢!事实上,我忘记了一个
移动
不会移动,实际上是一个演员阵容。我应该想到…
reaply&
不是一个好的术语。。。也许应该说
将T类型转换为T&
谢谢!事实上,我忘记了一个
移动
不会移动,实际上是一个演员阵容。我应该想到…
reaply&
不是一个好的术语。。。也许应该说
将类型T转换为T&
template<typename _Except>
struct _Nested_exception : public _Except, public nested_exception
{
    explicit _Nested_exception(_Except&& __ex)
    : _Except(static_cast<_Except&&>(__ex))
    { }
};