c++ - 使用 const_cast 添加 const-ness - 坏主意?

标签 c++ pointers const-cast

众所周知,应该避免使用 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,因为:

  1. 没必要。 T* 隐式转换为 const T*。您的问题表明 char sourcebuffer[] = {0x00}; copyfunction(sourcebuffer); 是一个错误,但事实并非如此。

  2. 它可能(尽管不太可能)有害。它可以从指针类型中删除 volatile,这不是这里的意图,如果 sourcebuffer 被声明为 volatile sourcebuffer[],将会导致未定义的行为>.

关于c++ - 使用 const_cast 添加 const-ness - 坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20956757/

相关文章:

c++ - 确保从父 CRTP 类派生的类实现功能

c++ - 32 位与 64 位上的字符类型

PHP - 一个方法可以返回一个指针吗?

c++ - C/C++ 指针保存用户数据吗?

c++ - 这是对 const_cast 的有效使用吗?

c++ - Ruby C++ 扩展中的多个构造函数

c++ - 如何找出标识符的名称是否为数组?

c++ - 如何在具有非常量指针键的映射中通过常量指针键查找

c++ - 将右值分配给 'const auto&' 时会发生什么