Ser*_*sly 3 c++ const-reference forwarding-reference
考虑我们需要实现一个f带有模板参数的函数T t。该函数不应同时复制t和接受rvalues和lvalues,因此可能有两种实现:
template <class T>
void f(const T& t) { ... }
template <class T>
void f(T&& t) { ... }
Run Code Online (Sandbox Code Playgroud)
如果我们想改变t里面f的值或者需要保留类的值,就得使用第二个版本了。那么根据这个思路,我们何时以及为什么会选择第一个选项?
当您想为您的函数的客户端提供强有力的保证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)
| 归档时间: |
|
| 查看次数: |
443 次 |
| 最近记录: |