rvalue-reference相关内容

函数的右值引用和返回值

我是C++11新手,在阅读C++11 FAQ时有以下问题。 假设我们有一个函数f()返回一个X类型的值,那么我们有以下方法来存储它的返回值: X a = f(); // copy assignment X&& b = f(); // move assignment 根据C++ FAQ,第二个可避免不必要的复制。 我的问题是:第二种方法总是接收函数调用返回值的首选方法吗?此 ..
发布时间:2022-05-08 10:23:47 C/C++开发

什么是T&&(双与号)在 C++11 中是什么意思?

我一直在研究 C++11 的一些新特性,我注意到其中一个是声明变量时的双 & 符号,例如 T&&变量. 首先,这个野兽叫什么?我希望 Google 允许我们搜索这样的标点符号. 具体是什么意思? 乍一看,它似乎是一个双重引用(就像 C 风格的双指针 T** var),但我很难考虑它的用例. 解决方案 它声明了一个 右值参考(标准提案文档). 这里是rvalue的介绍 ..
发布时间:2022-01-30 16:31:48 C/C++开发

C++“移出"容器

在 C++11 中,当我们想要将值移动(破坏性复制)到容器中时,我们可以使用 std::move 来提高效率: SomeExpensiveType x =/* ... */;vec.push_back(std::move(x)); 但我找不到任何相反的方向.我的意思是这样的: SomeExpensiveType x = vec.back();//复制!vec.pop_back();//啊 ..
发布时间:2022-01-24 21:08:41 C/C++开发

共享内存和写入时复制或右值引用以及移动语义?

通用容器(如 Qt 容器中的容器)的共享内存/写入时复制实现是否被 C++11 移动语义和右值引用取代? 一个失败而另一个成功的地方在哪里?还是它们是互补而非替代? 解决方案 写入时复制和移动语义都已用于优化将数据保存在堆上的对象的值语义.例如,std::string 既被实现为写时复制对象,又被实现为启用移动的对象. 所以写时复制和移动语义在这方面是相似的:如果你足够松散地定 ..

返回值的转发.需要 std::forward 吗?

我正在编写一个包含许多其他库中的函数和方法的库.为了避免处理返回值,我正在应用 std::forward ,如下所示: 模板T&&包装器(T&&t){f(t);//t 作为左值传递返回 std::forward(t);} f 返回 void 并采用 T&& (或重载价值).包装器始终返回包装器的参数,并且返回值应保留参数的价值.我真的需要在 return 中使用 std::forward ..
发布时间:2022-01-19 15:36:05 C/C++开发

我应该返回一个右值引用(通过 std::move'ing)吗?

A C++下一篇博文说过 计算(…){一个 v;…返回 v;} 如果 A 具有可访问的副本或移动构造函数,编译器可能会选择省略副本.否则,如果 A 具有移动构造函数,则移动 v.否则,如果 A 具有复制构造函数,则复制 v.否则,会发出编译时错误. 我认为我应该总是返回不带 std::move 的值因为编译器将能够为用户找出最佳选择.但在博客文章的另一个例子中 矩阵运算符+(Matri ..
发布时间:2022-01-19 14:47:49 C/C++开发

我应该使用 std::string 的右值编写构造函数吗?

我有一个简单的类: class X{std::string S;X (const std::string& s) : S(s) { }}; 我最近阅读了一些关于右值的文章,我一直在想,是否应该使用右值为 X 编写构造函数,这样我就可以检测 的临时对象std::string 类型? 我认为它应该是这样的: X (std::string&&s) : S(s) { } 据我所知,在支持 C ..
发布时间:2021-12-30 15:40:18 C/C++开发

为什么用户定义的移动构造函数会禁用隐式复制构造函数?

在阅读 boost/shared_ptr.hpp 时,我看到了这段代码: //生成的拷贝构造函数,析构函数都可以...#如果已定义(BOOST_HAS_RVALUE_REFS)//... 除了在 C++0x 中,move 禁用隐式复制shared_ptr( shared_ptr const & r ): px( r.px ), pn( r.pn )//从不抛出{}#万一 这里的注释“生成的复制 ..
发布时间:2021-12-24 15:02:52 C/C++开发

在 lambda 中移动捕获

如何在 C++11 lambda 中通过移动(也称为右值引用)进行捕获? 我正在尝试写这样的东西: std::unique_ptr我的指针(新整数);std::function示例 = [std::move(myPointer)]{*我的指针= 4;}; 解决方案 C++14 中的广义 lambda 捕获 在 C++14 中,我们将有所谓的 广义 lambda 捕获.这将启用移动 ..
发布时间:2021-12-23 21:43:57 C/C++开发

在代码优化期间,C++11 编译器是否会将局部变量转换为右值?

有时将复杂或长的表达式拆分为多个步骤是明智的,例如(第二个版本不是更清楚,但它只是一个示例): return object1(object2(object3(x))); 可以写成: object3 a(x);对象 2 b(a);对象 1 c(b);返回 c; 假设所有 3 个类都实现了以右值作为参数的构造函数,第一个版本可能会更快,因为临时对象被传递并且可以移动.我假设在第二个版本中,局部 ..

通过右值引用返回更有效吗?

例如: Beta_ab&&Beta::toAB() const {返回移动(Beta_ab(1, 1));} 解决方案 Beta_ab&&Beta::toAB() const {返回移动(Beta_ab(1, 1));} 这将返回一个悬空引用,就像左值引用一样.函数返回后,临时对象将被销毁.您应该按值返回 Beta_ab,如下所示 Beta_abBeta::toAB() const {返 ..
发布时间:2021-12-12 14:21:21 C/C++开发

什么是 T&&(双和号)在 C++11 中是什么意思?

我一直在研究 C++11 的一些新特性,我注意到一个是声明变量时的双 & 号,比如 T&&var. 首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号. 它究竟是什么意思? 乍一看,它似乎是一个双引用(就像 C 风格的双指针 T** var),但我很难想到它的用例. 解决方案 它声明了一个 右值参考(标准提案文档). 这是对右值的介绍参考. 这是微软标 ..
发布时间:2021-12-01 15:26:01 C/C++开发

使用 std::forward 的主要目的是什么以及它解决了哪些问题?

在完美转发中,std::forward 用于将命名的右值引用 t1 和 t2 转换为未命名的右值引用.这样做的目的是什么?如果我们离开 t1 & 这将如何影响被调用的函数 innert2 作为左值? template 空外(T1&& t1, T2&& t2){内部(std::forward(t1),std::forward(t2));} 解决方案 你必须了解转发问题.您可以详细阅读整个问题, ..
发布时间:2021-12-01 14:57:19 C/C++开发