33得票3回答
C++11中从函数调用返回std::vector的正确方式(移动语义)

我想填充std::vector(或其他STL容器):class Foo { public: Foo(int _n, const Bar &_m); private: std::vector<Foo> fooes_; } 1.构造函数外表好看,但性能昂贵std::ve...

26得票2回答
为什么不将RVO应用于基类子对象初始化?

为什么在继承的情况下(class B),以下代码中Base的移动构造函数是必需的(无论在gcc7.2还是clang 4.0中)? 我以为在C++17中有保证的复制省略,所以不需要它,就像在组合的情况下(class A)一样。struct Base { Base(Base&&am...

26得票3回答
为什么在返回参数时不允许使用RVO?

在[C++11: 12.8/31]中有这样的说明: 引用自该规范: 在具有类返回类型的函数的返回语句中,当表达式是非易失性自动对象的名称(除了函数或catch子句参数),且具有与函数返回类型相同的cv非限定类型时,可以通过直接将自动对象构造到函数的返回值中来省略复制/移动操作。 这意味着:...

24得票1回答
在多个返回语句的情况下,使用`std::move`返回是否明智?

我知道通常不建议使用std::move返回值,即bigObject foo() { bigObject result; /*...*/ return std::move(result); } 不是简单地bigObject foo() { bigObject result; /*...*/ re...

24得票2回答
对临时变量的const引用与返回值优化

我知道将一个右值分配给一个常量左值引用会延长临时对象的生命周期直到作用域结束。但是,什么情况下需要使用这种方法,什么情况下应该依赖返回值优化并不是很清楚。LargeObject lofactory( ... ) { // construct a LargeObject in a wa...

23得票4回答
理解返回值优化和返回临时变量 - C++

请考虑这三个函数。std::string get_a_string() { return "hello"; } std::string get_a_string1() { return std::string("hello"); } std::string get_a_st...

23得票1回答
当强制使用RVO(返回值优化)应用于延长临时对象生命周期的引用时会发生什么?

当一个引用被另一个继承了临时对象的引用初始化时,这个新引用并没有继承任何东西。 但是当强制使用 RVO(返回值优化)时,防止引用被复制,会发生什么呢? 考虑下面这个例子:#include <iostream> struct A { A() {std::cout <&...

22得票9回答
C++:返回引用和复制构造函数

在C++中,引用让我感到困惑。 :) 基本思路是我正在尝试从函数返回一个对象。如果可能的话,我希望不返回指针(因为那样我将不得不手动 delete 它),也不调用复制构造函数(为了提高效率自然添加:并且因为我想知道是否可以避免编写复制构造函数)。 所以,总的来说,这是我发现的做到这一点的...

17得票3回答
为什么使用std::make_pair从函数返回一个pair时,在使用结构化绑定时不会出现RVO?

考虑以下代码,定义了一个简单的结构体Test(带有默认构造函数和复制构造函数),并从函数中返回一个std::pair <Test,Test>。#include <iostream> #include <utility> using namespace st...

16得票4回答
RVO在对象成员上是否有效?

考虑以下内容: struct A { /* ... */ }; A foo() { auto p = std::make_pair(A{}, 2); // ... do something return p.first; } auto a = foo(); p.first...