C++ 何时使用 const 引用而不是转发引用

Ser*_*sly 3 c++ const-reference forwarding-reference

考虑我们需要实现一个f带有模板参数的函数T t。该函数不应同时复制t和接受rvalueslvalues,因此可能有两种实现:

template <class T>
void f(const T& t) { ... }

template <class T>
void f(T&& t) { ... }
Run Code Online (Sandbox Code Playgroud)

如果我们想改变t里面f的值或者需要保留类的值,就得使用第二个版本了。那么根据这个思路,我们何时以及为什么会选择第一个选项?

Jav*_*tíz 8

当您想为您的函数的客户端提供强有力的保证t并且不会在f. 尽管您可以删除constqualifier 并且仍然不修改t,但const如果您不更改它在函数内引用的值,则将其作为参数被认为是一种很好的做法和良好的界面设计,而且它有助于编译器更好地优化代码。

另外,如果你真的必须知道你可以const_cast用来破解类型安全const,但请记住你正在做的就是:摆脱类型安全。不惜一切代价避免这种情况。

最后,const限定符不会阻止复制,您可以轻松执行以下操作:

int main() 
{
   const int a = 3;
   int b = a; // a is copied to b
}
Run Code Online (Sandbox Code Playgroud)