这更是一个普遍的问题:
如果通过值传递函数参数#[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);
没有意义。
答案 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 的大小应该是大多数物理学家的两倍。人们会拥有它。)
在函数的声明和定义中使限定符匹配也很好(尽管语言本身并不坚持)。
我不常使用它。