const cast и stdderder - PullRequest
       1

const cast и stdderder

0 голосов
/ 15 ноября 2018

Модификация объекта const после const_cast - UB (я полагаю из-за постоянного распространения). Это все еще UB даже в сочетании с std::launder (что AFAIK предотвращает некоторые оптимизации, такие как распространение const)?

#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 голосов
/ 15 ноября 2018

const object - объект, тип которого является константным, или неизменяемый подобъект объекта const. Такой объект нельзя изменить : попытка сделать это напрямую - это ошибка времени компиляции, и попытка сделать это косвенно (например, путем изменения объекта const посредством ссылки или указателя на неконстантный тип) приводит к неопределенному поведению .

0 голосов
/ 15 ноября 2018

Да. Попытка изменить объект const - UB, точка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...