C++始终是构造函数中的Const引用?

Car*_*esi 1 c++ constructor pass-by-reference pass-by-value c++11

请考虑以下代码:

#include <iostream>
using namespace std;

class A {
public:
    A() = default;

    A(const A& rhs) {
        cout << "Copy was made!" << endl;
    }
};

class B {
public:
    A data;
    int foo;

    B(A data, int foo) : data(data), foo(foo) {
    }
};

int main() {
    A data;

    B foo(data, 10);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印出:

复制了!

复制了!

是的,它是正确的,它复制两次!

当我们传递dataB's构造函数时,第一个副本发生.当我们data从构造函数复制到memeber变量时,第二个副本就会发生.

我们知道我们不能复制1份(除非我们去heap & pointers).那么为什么我们不总是写:

B (const A& data, const int& foo, const SomeOtherType& bar, const float& aFloatyNumber) ... 等等.

我知道通过值传递int,float等是很便宜的.但是,通过始终const ref作为Constructor参数,我们将减少1份副本.

Die*_*ühl 5

如果你移动你正在消耗的对象,你实际上应该通过引用传递你的参数,可能是作为一个T const&.如果你确实使用了你的参数,你应该按值传递移动感知类型的对象(即,定义移动构造函数的类型)移动它.也就是说,如果A是移动感知,即有一个构造函数A::A(A&&),你可以使用:

B(A data, int foo) : data(std::move(data)), foo(foo) {
}
Run Code Online (Sandbox Code Playgroud)

如果您的类型不是移动感知的,或者您不需要从构造中挤出最后一点性能,或者类型是仅移动的,则可以安全地传递对象T const&.