gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:36:42 27 4
gpt4 key购买 nike

是否允许以下​​内容:

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 段:

Except that any class member declared mutable (10.1.1) can be modified, any attempt to modify a const object during its lifetime (6.8) results in undefined behavior

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

如果您查看关于const_cast 的部分,会注意到

[ Note: Depending on the type of the object, a write operation through the pointer, lvalue or pointer to data member resulting from a const_cast that casts away a const-qualifier76 may produce undefined behavior (10.1.7.1). — end note ]

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

关于c++ - 是否允许在 const 定义的对象上丢弃 const 只要它实际上没有被修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504247/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com