为什么我不应该在这个简单的函数中使用`const`?

arc*_*pus 12 c++ const parameter-passing

学习C++时,学习函数概念的第一个函数之一就是

int add(int a, int b)
{
    return a+b;
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道:我应该在const这里使用-keyword,或者更确切地说不是,因此

int add(const int a, const int b)
{
    return a+b;
}
Run Code Online (Sandbox Code Playgroud)

但那会有意义吗?它会加速我的程序,做一些其他重要的事情,或只是增加混乱?

Mr.*_*C64 15

调用者的角度来看,第一种和第二种形式都是相同的.

由于整数传递的价值,即使函数修改ab,修改后的值是副本原件并不会给调用者可见.

但是,从功能实现者的角度来看,存在差异.事实上,在第二种形式:

int add(const int a, const int b)
Run Code Online (Sandbox Code Playgroud)

如果您尝试修改函数体内部ab内部的值,则会出现编译器错误,因为它们被标记为const.

相反,如果省略,则可以更改这些值const.
同样,调用者不会看到这些修改.

  • 这个.在这种情况下你应该添加`const` [is*not*函数签名的一部分](http://stackoverflow.com/a/3682076/321013).这是*我*看到不包括这些简单函数的主要原因,因为它不是从调用者的角度"真的存在"而只是一个实现细节:对于这样一个简单的函数,它是一个不必要的复杂性. (2认同)

Bat*_*eba 7

使用int add(const int a, const int b)意味着您无法修改函数体内的输入参数.

也许编译器可以基于此进行一些优化,因此它应该永远不会比非等效的const.但我从未在实践中观察到这种效应.

传递const参数还可以提高代码库的稳定性,尤其是在协作项目中.

尽管如此,我发现它太冗长,相当不必要,而且会使用int add(int a, int b).偶尔,对于特别长的函数,我利用了这样一个事实:你可以用非参数声明函数const,并用参数定义const.

  • @SomeWittyUsername Pff,问题是关于传递值.关于通过引用传递的评论在这里无关紧要. (2认同)

Ker*_* SB 7

如果您真的在代码库中遇到正确的错误const,那么就会有所帮助,然后添加const.

也就是说,您应该考虑相关问题.函数参数的顶级限定符不是函数类型的一部分,因此您的函数类型仍然只是int(int, int).(限定词只影响在函数定义的参数变量).这意味着任何声明的功能也忽略了预选赛,所以int add(int, int)int add(const int, int)int add(int, const int)所有声明同样的功能.因此,您必须决定如何编写头文件的策略.现在,您可以采取三个基本立场:

  1. 始终符合声明和定义.好处是,这可能使代码看起来"一致"(在创建实现时想想复制/粘贴).缺点是限定符与接口无关,并且完全不可执行(您可以稍后更改定义!),所以最好是噪声,最坏的情况是错误的.

  2. 符合定义,但不符合其他声明.好处是,它正确地传达了接口,你仍然可以在定义中进行const检查.缺点是有些人可能会对拼写上的差异感到困惑.(就像人们可能会混淆static constexpr T foo;可以定义类成员一样const T C::foo;.)

  3. 不合格.好处是它一致,干净,易于记忆和最小化.缺点是您错过了定义中的正确性检查.

没有正确的答案.如果您是代码库所有者或项目负责人,则应根据代码库和团队中的最大问题来决定.(我的个人立场是坚持(3),直到你有充分的理由改变.)