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对象的指针是合法的.这是不允许的写入.