是否允许在const定义的对象上抛弃const,只要它实际上没有被修改?

Bee*_*ope 12 c++ const const-cast undefined-behavior

是否允许以下​​内容:

const int const_array[] = { 42 };

int maybe_inc(bool write, int* array) {
  if (write) array[0]++;
  return array[0];
}

int main() {
  return maybe_inc(false, const_cast<int *>(const_array));
}
Run Code Online (Sandbox Code Playgroud)

特别地,它是确定以铸远的常量性const_array,将其定义为const,只要对象是不实际修改,如在实施例?

Mar*_*ica 13

是.这完全合法.(这很危险,但它是合法的.)如果您(尝试)修改声明为const的对象,则行为未定义.

n4659(这是C++ 17的最后一个草案),第10.1.7.1节[dcl.type.cv]第4段:

除了可以修改任何声明为mutable(10.1.1)的类成员之外,任何在其生命周期内修改const对象的尝试(6.8)都会导致未定义的行为

我的重点.这是来自C++ 17,但对于所有版本的C++都是如此.

如果你看一下const_cast那里有一个注释

[注意:根据对象的类型,通过指针,左值或指向数据成员的指针的写操作会导致const-qualifier76的const_cast产生未定义的行为(10.1.7.1). - 结束说明]

注释不是规范性的,但这强烈暗示获取非const引用或指向const对象的指针是合法的.这是不允许的写入.

  • 令人惊讶的是,有多少错误的高度赞成的答案可以在这个主题上找到.这是另一个./sf/ask/25032031/ (9认同)
  • 有趣,所以[这个答案](/sf/answers/1368841001/)在说"你不允许const_cast变量实际上是const"时是错误的(或者至少是不精确的). - 实际的限制是你不允许_modify_变量实际上是const(当然,丢掉const会删除通常会阻止它的护栏)? (4认同)
  • @BeeOnRope确认,该引用不正确,您的解释是正确的. (4认同)
  • @BeeOnRope是的. (2认同)
  • @Mehdi这是为了允许将“实际上const”对象传递给在C中存在`const`之前编写的旧API,并且尚未更新,并且在原始问题中调用像`maybe_inc`这样的函数,程序员可以在其中看到数组不会被修改,但编译器不能。C 和 C++ 有着“信任程序员”的悠久传统。 (2认同)