【问题标题】:const int implicit conversion C++const int 隐式转换 C++
【发布时间】:2017-04-11 07:26:42
【问题描述】:

我想知道在使用指向常量整数的指针时变量之间是否存在某种隐式转换, 例如,如果我使用变量类型的地址 intconst int 它接受存储它, 但是,如果我使用普通的 pointer to int 它不允许存储 const int 类型的地址,这是为什么呢?提前谢谢

int i=4;
const int ii=4;

//pointer to constant int 
const int *pci=&i; //OK.
pci=ⅈ //OK.
int *pi=ⅈ //ERROR invalid conversion.

【问题讨论】:

  • 您要的是c++ 还是c?不同的语言;不同的标准; const 的不同含义。
  • int* 可以隐式转换const int*,反之则不行。在 C++ 中。
  • 将 const 指针分配给非 const 指针是错误的。原始被标记为 const 是有原因的,因此将其分配给非 const 指针被认为是错误的。但是我认为你可以用 const_cast 实现你想要的

标签: c++ casting constants const-cast


【解决方案1】:

第一个和第二个赋值将pci 初始化为constly 指向intconst int

所以你可能有以下两种情况之一:

  • const int* 指向 int

    pci=&i;
    
  • const int* 指向 const int

    pci=ⅈ
    

这两种情况都是安全的,因为您只是添加约束

通过做:

int *pi=ⅈ

您将int* 指向const int,这意味着您删除了约束

由于删除约束可能有风险,因此需要您使用const_cast

int* pi = const_cast<int*>(&ii);

请注意,强制删除 const 修饰符是 you should ask yourself twice if you really wanna do,因为它也会使 const 修饰符变得毫无意义,因为您将能够通过 "constant" 地址修改转换后的变量。

【讨论】:

  • @StoryTeller 经过这么多年,我仍然对此感到困惑。这可能是我在 C++ 中避免使用类似地狱的指针的原因。
  • @πάνταῥεῖ,喝了几品脱之后会变得更简单。
  • @StoryTeller 我在上面,谢谢提示;)
  • 有道理。 const 的意思是“我不想改变”,对吧?因此,防止将其分配给可以修改它的指针是有意义的。这将违背const 的目的。但是,在某些特殊情况下,您可能确实需要这个,因此是 const_cast。因此,您毕竟可以进行转换,但您需要在代码中明确声明它,明确您在做什么,这使得您(或您的团队)在尝试调试时更轻松。它清楚地说明了正在发生的事情,而不是默默地刹车。
  • @adam10603 有人说要从内到外以螺旋状的星号阅读...
【解决方案2】:

不允许简单地将指向const 元素的指针分配给指向非const 元素的指针,因为这会默默地忽略原始的const-ness,这是您不应该做的事情'不想要,也可能成为无声错误的来源,这是不允许的原因之一。

但是,如果这确实是您想要的,您可以使用 const_cast 明确请求删除 const 限定符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2020-12-14
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多