const cast和std洗钱

时间:2018-11-15 10:26:16

标签: c++ c++17

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;
}

2 个答案:

答案 0 :(得分:7)

是的。尝试修改const对象的时间段是UB。

答案 1 :(得分:4)

  

const object-类型为const限定的对象,或const对象的不可更改子对象。 无法修改此类对象:尝试直接这样做是编译时错误,并且<间接>尝试间接这样做(例如,通过引用或指向非const类型)会导致未定义的行为。

相关问题