gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:52:44 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com