为什么不总是在C++中通过const引用?

aan*_*nrv 6 c++ const reference function

我知道当你想要改变原始变量的值时,你会通过引用C++中的函数来传递.但是当你希望程序更有效时你也可以通过引用传递,如果你不想改变传递给函数的变量中的任何东西,你只需要使它成为const.我的问题是,为什么不总是让你的函数接受const引用传递的变量,如果它比传递变量更高效并让编译器在函数范围内创建一个新变量?为了扩展这个问题,一个函数WOULD需要复制一个变量而不是通过参数?

Die*_*ühl 6

当一个参数按值传递时,它是可修改的,复制它可能会被省略.例如,实现赋值运算符的规范方法如下所示:

T& T::operator= (T value) {
    value.swap(*this);
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

乍一看,它可能看起来效率低下,因为T正在被复制.但是,无论如何它都会被复制,也就是说,如果需要副本,则会以任何一种方式创建:

T& T::operator= (T const& value) {
    T(value).swap(*this); // has to do a copy right here
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

但是,对于第一个版本,例如,可能根本不创建副本

T f() { return T(); }
// ...
T x = ...;
x = f();
Run Code Online (Sandbox Code Playgroud)

当分配的结果f()是类型Tx编译器可以决定它不会需要复制的结果f(),而是直接传递到赋值运算符.在这种情况下,如果赋值运算符通过const&编译器获取参数,则必须在赋值运算符内创建副本.在按值实现参数的实现中,它可以忽略副本!实际上,返回来自f()已经可以忽略副本,即调用f()和后面的赋值可能只涉及对象的默认构造!......对于许多现代编译器而言确实如此!

换句话说:如果您需要复制参数,通过值传递它可以避免创建副本的需要.此外,您可以std::move()从值参数而不是const&参数.