问题标签 [rvalue-reference]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
609 浏览

c++ - RValue 引用、指针和复制构造函数

考虑以下代码:

我的问题是,为什么第三次重载Foo::bar(T&& t)会使程序崩溃?这里到底发生了什么?函数返回后参数是否t被销毁?

此外,让我们假设模板参数T是一个非常大的对象,具有非常昂贵的复制构造函数。有没有办法使用 RValue 引用来分配它Foo::ptr而不直接访问这个指针并制作副本?

0 投票
2 回答
245 浏览

c++ - 在 C++ 中链接对临时对象的调用

我有一个对字符串进行转换的类,就像这样

所以我可以创建一个子类

然后我可以使用转换:

有没有更好的设计呢?如果可以的话,我想避免使用动态分配/shared_ptr,但我不确定临时人员是否会在整个通话过程中保持活力。我还希望能够让每个人transer都能够在销毁期间与其父级对话,因此临时人员也需要以正确的顺序销毁。创建链式转换并将其保存以备后用也很困难,因为

将保存指向不再存在的临时对象的指针。做类似的事情

会很安全,但很烦人。有没有更好的方法来执行这些类型的链式操作?

0 投票
2 回答
3091 浏览

c++ - 关于捕获异常的良好做法

我正在用 C++11 编写一个小程序,并且第一次真正使用异常。

我有一个关于如何有效捕获异常的问题,经过一番谷歌搜索后,我仍然没有答案。

这是一个问题:通过(const?)左值引用或(const?)右值引用捕获异常之间更有效(或推荐)的是什么?

在代码中,这给出:

1)

2)

3)

4)

0 投票
1 回答
1208 浏览

c++ - 我是否需要重载为右值引用明确接受 const 左值引用的方法?

目前我正在玩右值引用(C++11,g++ 与 gnu++x0),我想在我的类中实现移动语义,因为它只是感觉“正确”。

我是否需要重载通常接受 const 左值引用的每个函数以从右值引用中受益?

假设这是我的示例类:

我现在想将 setter 与右值引用一起使用并消除不必要的副本。

我真的需要以这种方式重载每个方法吗?

这对我来说似乎非常多余。有什么方法可以更轻松地实现这一点吗?

谢谢!

(我经常阅读stackoverflow,但这是我的第一个问题。所以如果我做错了什么,请给我提示。)

0 投票
4 回答
1654 浏览

c++ - C++:什么是技术层面的 R 值参考 (ASM)?

可能重复:
右值引用和左值引用有什么区别?(代码生成)

我想知道,谁能在技术层面上解释一下 R 值参考是什么?我的意思是:当创建 R 值引用时,汇编程序级别会发生什么。

为了进行小测试以了解内部发生的情况,我编写了以下代码:

我知道创建对“c”的 R 值引用是没有意义的,但只是为了测试,我还是这样做了,看看它做了什么。结果如下:

到目前为止,我还不是 asm 专家,但在我看来,在这种情况下,“c3”最终是对“c”的常规引用。

如果我将 R-Value 引用直接绑定到一个临时值(char &&c3 = 255),汇编程序的最后一位会更改为:

从这个变化的外观来看,我假设 c3 实际上仍然是对某个包含值 255 的内存位置的引用。所以它是一个常规引用​​ - 该值不会被复制/分配给 c3。这是真的?

谁能说我的假设是正确的还是我完全偏离了轨道?到目前为止,在调用解析时,我一直认为 R-Value 引用来匹配函数/方法签名(可能是 move-ctor),以便编码人员知道如何处理提供的数据(对于 move-ctor那将是移动数据而不是复制它)。

为了捍卫我刚刚提出的这个相当愚蠢的尝试:我不打算在 asm 级别上搞砸我的代码,我只是想了解这些年来 R-Value 引用与其他引用相比引入了哪些技术差异。

任何见解和解释都非常受欢迎!

谢谢!

0 投票
2 回答
195 浏览

c++ - 在 C++ 中实现返回的计算值的最有效方法是什么?

随着返回值优化之上的右值引用的出现,实现这样的核心功能的最有效方法是什么?我该如何改进这个实现,或者我应该不理会它?

显然,如果可以的话,我想避免复制或分配内存。TIA。

编辑:感谢 D. Rodriguez 提供详细的答案。现在,我的问题有第二部分。有没有办法改善这一点?

当然,如果可以的话,我想避免使用 MACRO,但是如果我复制并粘贴上面的模板代码以返回 ss.str().c_str() 和 const char*,则临时文件的寿命不够长;尽管代码似乎可以运行,但 valgrind 抱怨(红灯)。

对于 to_cstr(),我无法想出比上面的 MACRO 更清洁的解决方案。任何想法如何改进,或者我也应该不理会?

0 投票
1 回答
320 浏览

string - 在 C++ 字符串构造中移动语义和 R 值引用

C++11 是否会在参数字符串构造中移动语义和 r 值引用,例如

例如假设声明

可以防止多余的堆复制"abc"

如果是这样,它会在不必要的情况下使用const char包装器吗?boost::crefboost::const_string

0 投票
1 回答
307 浏览

c++ - 构造函数的首选参数传递

是否有传递构造函数参数的首选做法?特别是如果这些构造函数参数用于初始化成员变量。

一个简化的例子。

选项包括:

  • 按值传递,然后std::move将对象放入成员中。
  • const&,然后将参数复制到成员中。
  • &&,然后用参数初始化成员。

我的默认/首选参数传递方式应该是什么?
它会随着不同的参数类型而变化吗?

我的直觉说使用右值引用,但我不确定我是否理解所有的利弊。

0 投票
2 回答
2191 浏览

c++ - 防止非常量左值解析为右值引用而不是 const 左值引用

我在重载一个函数以通过 const 引用获取值时遇到问题,或者,如果它是一个右值,一个右值引用。问题是我的非常量左值绑定到函数的右值版本。我在 VC2010 中这样做。

优先级似乎是将 foo(x) 推断为

代替

我尝试将右值引用版本替换为

但这只会导致所有内容都解析为 const-lvalue 参考版本。

如何防止这种行为?以及为什么这是默认值 - 考虑到允许修改右值引用,这似乎很危险,这给我留下了一个意外修改的局部变量。

编辑:刚刚添加了函数的非模板版本,它们按预期工作。使函数成为模板会更改重载解析规则?那是..真令人沮丧!

0 投票
5 回答
8899 浏览

c++ - 如何使模板右值引用参数仅绑定到右值引用?

我正在编写一个网络库并大量使用移动语义来处理文件描述符的所有权。我的一个班级希望接收其他类型的文件描述符包装器并获得所有权,所以它类似于

它必须处理多个不相关的类型,因此 receive_ownership 必须是一个模板,并且为了安全起见,我希望它只绑定到右值引用,以便用户在传递左值时必须显式声明 std::move 。

receive_ownership(std::move(some_lvalue));

但问题是:C++ 模板推导允许传入一个左值而不需要额外的努力。实际上,我不小心将一个左值传递给了receive_ownership,并在以后使用该左值(清除),实际上是我自己开枪打死了自己。

所以这里有一个问题:如何使模板只绑定到右值引用?