【发布时间】:2010-12-15 23:51:08
【问题描述】:
我知道很少有关于 const 正确性的问题,其中声明函数的声明及其定义不需要就值参数达成一致。这是因为值参数的常量只在函数内部很重要。这很好:
// header
int func(int i);
// cpp
int func(const int i) {
return i;
}
这样做真的是最佳做法吗?因为我从未见过有人这样做。我在其他地方看到过这个引用(不确定来源),这已经被讨论过:
“事实上,对于编译器来说,无论你在值参数前是否包含这个const,函数签名都是一样的。”
"避免在函数声明中使用 const 传值参数。如果不修改,仍将参数 const 放在同一个函数的定义中。"
第二段说不要将 const 放在声明中。我认为这是因为值参数的常量性作为接口定义的一部分是没有意义的。这是一个实现细节。
基于这个推荐,指针参数的指针值是否也推荐? (它对引用参数没有意义,因为您不能重新分配引用。)
// header
int func1(int* i);
int func2(int* i);
// cpp
int func1(int* i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compiles without error
return *i;
}
int func2(int* const i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compile error
return *i;
}
总结:制作值参数对于捕捉一些逻辑错误很有用。这是最佳实践吗?您是否走到了将 const 排除在头文件之外的极端? const 指针值是否同样有用?为什么或为什么不?
一些参考资料:
C++ const keyword - use liberally? Use of 'const' for function parameters
const 值参数何时有用的示例:
bool are_ints_equal(const int i, const int j) {
if (i = j) { // without the consts this would compile without error
return true;
} else {
return false;
}
// return i = j; // I know it can be shortened
}
【问题讨论】:
-
在这种情况下它会捕获“if (i = j)”错误,但不会捕获所有此类错误,所以我不会对那个特定的理由感到太兴奋(因为你可以与变量相同的错误)。即使没有 const,如果你告诉它你想要警告,你的编译器也应该警告你。
-
对
if (i = j)感到兴奋的一点是要意识到 const 值参数不仅仅是绒毛。 Michael Burr 的例子比这个更好。 -
在您不更改函数参数的情况下,您应该使用 const 参数,因为 A)它更安全,B)它是自文档化的,C)它对调试更友好。此外,原型和标头应标记为 const。如果只在函数头中完成,那就令人困惑了。关于在函数中创建临时变量的论点是您可能不需要声明参数 const 的情况。这是我的 2 便士。
标签: c++ pass-by-value const-correctness