使按值常量传递的参数有什么意义?

What is the point of making an argument that is passed by value constant?

这是一个更普遍的问题: 如果按值传递函数参数 const 有什么意义吗?

在我正在研究的代码中,我看到了很多以下内容:

void some_function(const std::vector<double> some_vec);

std::vector是按值传递的,那么const的意义何在?

就像我理解的那样,如果函数是通过引用传递向量:

void some_function(const std::vector<double> &some_vec);

但我认为前者的 const 毫无意义。

它可以 非常 特别是在处理数学代码时非常有用,因为它可以阻止错误的重构者更改作为函数参数传入的变量。例如,您不想弄乱 pi 的值(烦人的是,它不是 C++ 标准的一部分),或者像引力常数 &c.

(过去我看到pi *= 2;因为代码是由一位物理学家写的,他确信pi应该是大多数人认为的两倍大。)

在函数声明和定义中匹配限定符也很好(尽管语言本身并不坚持这一点)。

我承认我用得不多。

关键是你要防止函数体改变值。函数参数只是函数体内的一个自动变量,您可能希望确保它保持其输入值。考虑

int foo(int x)
{
    /* lots of code */
    some_other_func(x);  // may modify x
    /* even more code */
    return x+42;         // x may have been modified
}

int foo(const int x)
{
    /* lots of code */
    some_other_func(x);  // will not compile if x is taken by non-const reference
    /* even more code */
    return x+42;         // x is guaranteed at its input value
}

根据经验,声明所有 const 不打算更改的内容。然后,如果您或其他人不小心尝试更改此类变量,则会导致编译时错误。

另请注意,const 声明符在函数声明中没有作用,仅在函数定义中起作用,即以下内容非常好(实际上推荐):

struct bar
{
   int foo(int) const;
   /* more code */
};

int bar::foo(const int x) const // possibly in another compilation unit
{
   ...
}