在下面的允许:
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
的常量性,其被定义为常量,只要对象是不实际修改,如在实施例?
是。这是完全合法的。 (这是危险的,但它是合法的。)如果你(尝试)修改一个对象声明为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对象是合法的。这是不允许写。