(1)功能的论据,我知道永远不会改变.例如.:
void foo (const int i,const string s) ^^^^^ ^^^^^
(2)返回类型为const.例如.:
struct A { ... const int foo () { return ...; } ^^^^^ operator const bool () const { return ...; } ^^^^^ };
(3)整数或字符串的简单计算.例如.:
const uint size = vec.size(); ^^^^^ const string s2 = s1 + "hello "; ^^^^^
…还有更多的地方.通常在其他现实世界的代码中,我看不到这样的小型变量标记为const.但是我认为,使他们永远不会伤害.这是一个很好的编程实践吗?
解决方法
通常,无论您是否将局部变量const标记为局部变量,短函数都不会有什么区别,因为您可以在整个范围内看到它们的全部范围.您可以看到值是否改变,您不需要或希望编译器强制执行.
然而,它有助于帮助,因为它可以保护您免于意外地将它们传递给使用非const引用的参数,而不会意识到您正在修改变量.因此,如果在生命周期中将变量作为函数参数传递,那么将其标记为const可以让您更有信心,知道它之后有什么价值.
偶尔,标记一个变量const可以帮助优化器,因为你告诉它,对象永远不会被修改,有时这是真的,但编译器不能以其他方式证明它.但是,由于这个原因,这可能不值得,因为在大多数情况下,这并没有什么区别.
(2)是另一回事.对于内置类型,没有什么区别,正如其他人所说明的那样.对于类类型,不要返回const值.这似乎是一个好主意,因为它阻止用户写一些无意义的东西,如func_returning_a_string()=“extra text”;但它也阻止了一些有意义的东西–C11移动语义.如果foo返回一个const字符串,并且我写std :: string s =“foo”; if(condition)s = foo();那么在s = foo();.如果foo返回一个非const字符串,那么我得到移动赋值.
类似地,在没有移动语义的C 03中,它防止了称为“swaptimization”的技巧 – 使用非const返回值,我可以写入foo().swap(s);而不是s = foo();.