它是允许的,只要它是不实际修改抛弃const的一个const定义的对象呢?

问题描述 投票:9回答:1

在下面的允许:

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));
}

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

c++ const undefined-behavior const-cast
1个回答
12
投票

是。这是完全合法的。 (这是危险的,但它是合法的。)如果你(尝试)修改一个对象声明为const,则行为是不确定的。

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

除了任何类成员声明可变(10.1.1)可以被修改,任何试图在其寿命期间修改const对象(6.8)中未定义的行为结果

我的重点。这是C ++ 17,但这已经C ++的所有版本都是如此。

如果你看一下在const_cast部分有一张纸条,上面

[注:根据对象,通过指针,左值或指针以从转换丢失了一个const-qualifier76可能会产生不确定的行为(10.1.7.1)const_cast类型转换得到的数据成员的写操作的类型。 - 注完]

注释不规范,但是这强烈暗示获得一个非const引用或指针const对象是合法的。这是不允许写。

© www.soinside.com 2019 - 2024. All rights reserved.