函数参数作为Const参考

Stu*_*t H 14 c++

有什么理由不将参数作为a const &而不是值发送,当它不会被更改并且不会复制时?我的理解是,constby value参数与没有const(并且不会相互重载)相同,因此它仍然会被复制.

我知道最好发送大型对象const &,但我不知道这条线的位置.或者,如果即使是很小的参数应该由值被发送,如果他们将不会改变或复制.

注意::我试图搜索这个,但主题相当模糊,所以我没有找到任何好的答案,我道歉,如果已经回答了这个问题(发现许多问题关于何时使用const何时使用const &但不是关于价值vs的优点const &对于不明显大的物体).

Ker*_* SB 24

将只读参数作为const引用传递通常没有错,对于任何类型的重量级类来说,这肯定是最有效的方法.

您可能想要考虑通过复制传递基本类型,因为这使得引用实际上可能比仅仅复制产生更多的成本(例如,复制只适合一个寄存器,而引用可能用指针实现,等等).

此外,您可以std::shared_ptr通过值传递和迭代器,它们是为此而制作的.

至于传递const值,这是一个实现细节.像这样使用它:

// Declaration:
int foo(int n, double d); // No "const"! Constness is not part of the interface.

// Definition
int foo(int n, const double d) // implementation detail
{
  while (n--) { if (d > n) return n; }
}
Run Code Online (Sandbox Code Playgroud)

在实现中,您可能会也可能不会选择直接使用参数变量并对其进行修改(如n),或者您可以选择将它们视为只读(如d),并适当地声明参数.

  • 值得指出的是,如果你通过引用跨越一个线程边界传递一个引用计数句柄(比如`shared_ptr`)那么就不可能安全地减少引用计数** - 你*有*传递值在这种情况下. (7认同)
  • 我没有想到指针复制对于原始类型来说同样昂贵或更糟,谢谢. (3认同)

Fer*_*yer 14

根据经验,您应该传递基本类型,例如指针,int(bool)float,double(非常量)值,对象类型(如std::string)std::vector和(const)引用的自定义类.作为此规则的一个例外,有一些轻量级类专门设计为按值传递,例如智能指针.

通过const值传递一个值,例如void foo(const double bar)没有意义 - 为什么不foo应该允许修改它的副本bar?将参数声明为const在此处没有用处.

通过引用传递基元也没什么意义.在幕后,当通过引用传递参数时,指针按值传递.复制指针通常与复制基本类型(例如int)一样昂贵,并且const int&对于大多数C++程序员来说,类型的参数看起来很奇怪.

  • 有些人(我不在其中)实际上更喜欢`const double bar`.他们说它通过覆盖函数中参数的值来防止错误. (4认同)