在const_cast之后修改const构造对象是UB(我相信是由于不断传播)。即使与std::launder
(该AFAIK会阻止某些优化(例如const传播))结合使用,它仍然是UB吗?
#include <new>
#include <iostream>
struct C
{
int i;
};
int main(const int argc, const char * const * const argv)
{
const C c{1};
auto x = std::launder(const_cast<C*>(&c));
++x->i;
std::cout << x->i << std::endl;
std::cout << c.i << std::endl;
return 0;
}
答案 0 :(得分:7)
是的。尝试修改const对象的时间段是UB。
答案 1 :(得分:4)
const object-类型为const限定的对象,或const对象的不可更改子对象。 无法修改此类对象:尝试直接这样做是编译时错误,并且<间接>尝试间接这样做(例如,通过引用或指向非const类型)会导致未定义的行为。