众所周知,应该避免使用 const_cast 来移除指针的常量性。
但反过来又如何呢?
对于我的用例,我有一个从非常量源缓冲区复制数据(字节)的函数。 我认为一个好的设计决定是根据该源缓冲区完全 const 声明参数。
void copyfunction(const char* const data) { ... }
对于像下面这样的函数调用,这将导致指针类型错误“const char* const <-> char*”。
void main() {
char sourcebuffer[] = {0x00};
copyfunction(sourcebuffer);
}
当然,现在我可以简单地将 sourcebuffer
声明为 const,但在我的例子中我无法访问该变量,因为它来自不同的代码位置(外部库)。
void main() {
char sourcebuffer[] = {0x00};
copyfunction(const_cast<const char* const>(sourcebuffer));
}
然而,超出的代码可以工作,但它是好的风格(根据我的用例)吗?
我认为将 copyfunction
的参数声明为 const 可以确保用户不会修改(只读)指针或源缓冲区本身的位置。
所以在这种情况下,const_cast 只是启用函数调用所必需的邪恶,而不是故意删除指针的 const-ness...
问候
最佳答案
你不应该使用const_cast
来添加const
,因为:
没必要。
T*
隐式转换为const T*
。您的问题表明char sourcebuffer[] = {0x00}; copyfunction(sourcebuffer);
是一个错误,但事实并非如此。它可能(尽管不太可能)有害。它可以从指针类型中删除
volatile
,这不是这里的意图,如果sourcebuffer
被声明为volatile sourcebuffer[]
,将会导致未定义的行为>.
关于c++ - 使用 const_cast 添加 const-ness - 坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20956757/