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

时间:2018-12-18 14:07:05

标签: c++ const pass-by-value

这更是一个普遍的问题: 如果通过值传递函数参数#[target_feature(enable = "ssse3")] unsafe fn doit() { // ... } ,那有什么意义呢?

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

const

void some_function(const std::vector<double> some_vec); 是按值传递的,那么std::vector的意义是什么?

就像我会理解函数是否通过引用这样传递向量:

const

但我认为前者的void some_function(const std::vector<double> &some_vec); 没有意义。

2 个答案:

答案 0 :(得分:5)

重点是要防止函数主体更改值。 function参数只是函数体内的一个自动变量,您可能要确保它保持在其输入值。考虑

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
{
   ...
}

答案 1 :(得分:4)

尤其是在处理数学代码时,它可能非常有用,因为它可以防止错误的重构器更改作为函数参数传入的变量。例如,您不想弄混 pi 的值(令人讨厌的是,它不是C ++标准的一部分),或者像引力常数&c之类的东西。

(过去,我 曾见过df = df[df['col2'].str.startswith(tuple(L))].copy() m = df.groupby('col1')['col2'].agg(['size','nunique']) == len(L) df = df[df['col1'].isin(m.index[np.all(m, axis=1)])] print (df) ID col1 col2 0 1 A P1.adv abcd 1 2 A P2.cmp mkmfwk 2 3 A P3.part 1pwf ,因为该代码是由物理学家编写的,他确信 pi 的大小应该是大多数物理学家的两倍。人们会拥有它。)

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

我不常使用它。