在我编写 C++ 函数时,我似乎比其他人使用了更多的 const
修饰符。
例如,我编写 Excel .xlsx 文件并为此使用 LibXL 库,而 documentation提到这样一个函数:
bool writeNum(int row, int col, double value, Format* format = 0)
我碰巧继承了这个函数,我的签名是这样的:
bool XLAPIENTRY writeNum(const int row, const int col, const double value, IFormatT<wchar_t> * format = 0);
注意行和列的 const int
。
问题:为 int
省略 const
是否安全? (很明显,对于指针,为指针省略 const 是危险的,但是做一些 int
的本地拷贝并不那么危险)。请注意,包含 writeNum 函数的原始 header 也没有提及 const-ing int
s。为什么这里省略了 const
修饰符?
最佳答案
在声明(与定义相反)中,参数上的顶级1 const 无效。可以说,它是函数的实现细节,不应该出现在声明中(它会增加困惑,但不会为调用者提供任何新信息)。
请注意 const int x
和 int *const x
是顶级常量,而 const int *
和 const int &
不是,所以后者不能有它的const
删除。
在定义中,您可以包含const
如果它可以帮助您作为函数的实现者(所以您不会意外更改参数)。
1 “顶级常量”表示“实际上是常量”,而不是例如仅仅是一个指向 const 的指针。您可以通过 std::is_const_v
查看此属性.
例如:
-
std::is_const_v<const int> == true
(const 整数) -
std::is_const_v<const int *> == false
(非 const 指向 const 整数的指针) -
std::is_const_v<int *const> == true
(const 指向非常量整数的指针) -
std::is_const_v<const int **> == false
(非常量指向非常量的指针,指向常量整数) -
std::is_const_v<int *const *> == false
(non-const 指向 const 的指针 指向非 const 整数的指针) -
std::is_const_v<int **const> == true
(const指向非常量的指针,指向非常量整数的指针)
关于c++ - 什么时候从函数的参数化中省略 const 是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74094760/