修改 C++20 中非 const 对象的 const 成员 [duplicate]

Modifying const members of non-const object in C++20 [duplicate]

提问人:Joel Niemelä 提问时间:7/3/2022 最后编辑:Joel Niemelä 更新时间:7/4/2022 访问量:283

问:

是否可以在 C++20 中修改非常量对象的 const 字段(使用 const_cast)?

是的,我知道它可能不应该被允许,并且有非常相似的问题(移动具有常量成员的类的构造和赋值将某个类型的变量替换为 const 成员)。但是一些答案和评论似乎表明这在 C++ 20 中是可能的;但我找不到任何明确说明这是允许的。

例如:

从 c++20 开始,您可以修改 const 成员对象。甚至还有一个 constexpr 函数来做到这一点,以及 如果对象具有非平凡的 DTOR。– 道格 4 月 14 日construct_atdestroy_at

(评论 https://stackoverflow.com/a/68018681/8245776)

以及这个答案(https://stackoverflow.com/a/71805401/8245776),老实说我不太明白,但它似乎在说在 C++20 中是可能的。

那么是否可以在 C++ 20 中做到这一点,还是我误解了这些答案?

编辑:

好的,从提到的问题来看,我认为答案是在 C++20 中可能吗?不过我仍然不确定,所以如果有人能证实这一点,那将不胜感激。

C++(英语:C++) 常数 C++20 常播

评论

1赞 BoP 7/3/2022
严格来说,它不会修改对象,而是创建一个新对象。construct_at
0赞 Natio2 7/3/2022
如果您有访问权限,则可以非常确定地删除 auto* notConst = const_cast<type*>(&member);如果这样做,某些事情可能会中断/工作与预期不同,因为编译器会使用此值进行优化。
0赞 Joel Niemelä 7/4/2022
@BoP对,但是通过旧的(const)变量访问该新对象是否合法?或者这是否会导致未定义的行为?从其他人的说法来看,这似乎是合法的,但由于const_cast不是并且(至少有效地)做了“同样的事情”(我知道它在引擎盖下是不同的),所以感觉也应该是非法的。construct_at
1赞 BoP 7/4/2022
construct_at返回指向新对象的指针。该指针将有效。使用旧的指针可能是一个问题,因为编译器可以(相当合理地)假设 const 对象不会更改。你可以(也许)使用 std::launder 来洗掉它,但我不确定它是如何工作的。
1赞 doug 7/6/2022
在 C++20 之前,需要@BoP访问此修改后的常量数据。从 c++20 开始,修改后的常量立即变为活动状态,并且可以以正常方式引用成员变量。请参阅 basic.lifetimestd::launder

答: 暂无答案