rvalue-reference相关内容
我是C++11新手,在阅读C++11 FAQ时有以下问题。 假设我们有一个函数f()返回一个X类型的值,那么我们有以下方法来存储它的返回值: X a = f(); // copy assignment X&& b = f(); // move assignment 根据C++ FAQ,第二个可避免不必要的复制。 我的问题是:第二种方法总是接收函数调用返回值的首选方法吗?此
..
我一直在研究 C++11 的一些新特性,我注意到其中一个是声明变量时的双 & 符号,例如 T&&变量. 首先,这个野兽叫什么?我希望 Google 允许我们搜索这样的标点符号. 具体是什么意思? 乍一看,它似乎是一个双重引用(就像 C 风格的双指针 T** var),但我很难考虑它的用例. 解决方案 它声明了一个 右值参考(标准提案文档). 这里是rvalue的介绍
..
在 C++11 中,当我们想要将值移动(破坏性复制)到容器中时,我们可以使用 std::move 来提高效率: SomeExpensiveType x =/* ... */;vec.push_back(std::move(x)); 但我找不到任何相反的方向.我的意思是这样的: SomeExpensiveType x = vec.back();//复制!vec.pop_back();//啊
..
通用容器(如 Qt 容器中的容器)的共享内存/写入时复制实现是否被 C++11 移动语义和右值引用取代? 一个失败而另一个成功的地方在哪里?还是它们是互补而非替代? 解决方案 写入时复制和移动语义都已用于优化将数据保存在堆上的对象的值语义.例如,std::string 既被实现为写时复制对象,又被实现为启用移动的对象. 所以写时复制和移动语义在这方面是相似的:如果你足够松散地定
..
..
我有一个带有以下声明的类: 类 IcoSphere{[...]私人的:int _addVertex(const glm::vec3 &p);int addVertex(glm::vec3 p);int addVertex(const glm::vec3 &&p);[...]}; 然后,我像这样调用“addVertex": IcoSphere 球体;双 t = (1.0 +sqrt(5.0))
..
我只是在启用 -std=c++11 的情况下使用 g++ 4.7(后来的快照之一).我试图编译我现有的一些代码库,一个失败的案例让我有些困惑. 如果有人能解释发生了什么,我将不胜感激. 代码如下: #include #include #include #include 主函数 ( ){std::string s = "abc";
..
我正在编写一个包含许多其他库中的函数和方法的库.为了避免处理返回值,我正在应用 std::forward ,如下所示: 模板T&&包装器(T&&t){f(t);//t 作为左值传递返回 std::forward(t);} f 返回 void 并采用 T&& (或重载价值).包装器始终返回包装器的参数,并且返回值应保留参数的价值.我真的需要在 return 中使用 std::forward
..
A C++下一篇博文说过 计算(…){一个 v;…返回 v;} 如果 A 具有可访问的副本或移动构造函数,编译器可能会选择省略副本.否则,如果 A 具有移动构造函数,则移动 v.否则,如果 A 具有复制构造函数,则复制 v.否则,会发出编译时错误. 我认为我应该总是返回不带 std::move 的值因为编译器将能够为用户找出最佳选择.但在博客文章的另一个例子中 矩阵运算符+(Matri
..
我有一个简单的类: class X{std::string S;X (const std::string& s) : S(s) { }}; 我最近阅读了一些关于右值的文章,我一直在想,是否应该使用右值为 X 编写构造函数,这样我就可以检测 的临时对象std::string 类型? 我认为它应该是这样的: X (std::string&&s) : S(s) { } 据我所知,在支持 C
..
在阅读 boost/shared_ptr.hpp 时,我看到了这段代码: //生成的拷贝构造函数,析构函数都可以...#如果已定义(BOOST_HAS_RVALUE_REFS)//... 除了在 C++0x 中,move 禁用隐式复制shared_ptr( shared_ptr const & r ): px( r.px ), pn( r.pn )//从不抛出{}#万一 这里的注释“生成的复制
..
如何在 C++11 lambda 中通过移动(也称为右值引用)进行捕获? 我正在尝试写这样的东西: std::unique_ptr我的指针(新整数);std::function示例 = [std::move(myPointer)]{*我的指针= 4;}; 解决方案 C++14 中的广义 lambda 捕获 在 C++14 中,我们将有所谓的 广义 lambda 捕获.这将启用移动
..
有时将复杂或长的表达式拆分为多个步骤是明智的,例如(第二个版本不是更清楚,但它只是一个示例): return object1(object2(object3(x))); 可以写成: object3 a(x);对象 2 b(a);对象 1 c(b);返回 c; 假设所有 3 个类都实现了以右值作为参数的构造函数,第一个版本可能会更快,因为临时对象被传递并且可以移动.我假设在第二个版本中,局部
..
我只是在玩启用了 -std=c++11 的 g++ 4.7(后来的快照之一).我试图编译一些我现有的代码库,一个失败的案例让我有些困惑. 如果有人能解释发生了什么,我将不胜感激. 代码如下: #include #include #include #include 内部主(){std::string s = "abc";//1 好的std::pair
..
例如: Beta_ab&&Beta::toAB() const {返回移动(Beta_ab(1, 1));} 解决方案 Beta_ab&&Beta::toAB() const {返回移动(Beta_ab(1, 1));} 这将返回一个悬空引用,就像左值引用一样.函数返回后,临时对象将被销毁.您应该按值返回 Beta_ab,如下所示 Beta_abBeta::toAB() const {返
..
我发布了这个答案:https://stackoverflow.com/a/28459180/2642059 其中包含以下代码: void foo(string&& bar){string* temp = &bar;cout
..
这个程序试图将一个字符串移出函数并用它来构造另一个字符串: #include #include #include std::string &&Get_String(void);int main(){std::string str{Get_String()};std::cout
..
我正在尝试理解 C++11 的右值引用和移动语义. 这些例子有什么区别,哪些不做向量复制? 第一个例子 std::vector返回向量(无效){std::vectortmp {1,2,3,4,5};返回 tmp;}std::vector&&rval_ref = return_vector(); 第二个例子 std::vector&&返回向量(无效){std::vectortmp
..
我一直在研究 C++11 的一些新特性,我注意到一个是声明变量时的双 & 号,比如 T&&var. 首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号. 它究竟是什么意思? 乍一看,它似乎是一个双引用(就像 C 风格的双指针 T** var),但我很难想到它的用例. 解决方案 它声明了一个 右值参考(标准提案文档). 这是对右值的介绍参考. 这是微软标
..
在完美转发中,std::forward 用于将命名的右值引用 t1 和 t2 转换为未命名的右值引用.这样做的目的是什么?如果我们离开 t1 & 这将如何影响被调用的函数 innert2 作为左值? template 空外(T1&& t1, T2&& t2){内部(std::forward(t1),std::forward(t2));} 解决方案 你必须了解转发问题.您可以详细阅读整个问题,
..