Является ли это const_cast в контексте неопределенного поведения со стиранием типа?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Является ли это const_cast в контексте неопределенного поведения со стиранием типа?

Сообщение Anonymous »

Глядя на этот пример: https://github.com/PacktPublishing/Hand ... function.C
который представляет собой реализацию std::function с небольшой оптимизацией буфера, я заметил, что оператор вызова является const, и происходит const_cast on.
Теперь, если кто-то создает константную функцию foo, которая оборачивает вызываемый объект неконстантным voidoperator()(), который изменяет внутреннее состояние, поскольку небольшой буфер хранится в объекте (и должен быть константным, потому что foo), из-за приведения const происходит изменение константной памяти. Мне было интересно, является ли это UB, и если нет, то каково объяснение?
Я попытался изложить приведенный выше пример в приведенном ниже коде, где есть объект X с модифицирующим оператором вызова, который стирается по типу в Foo, и его оператор вызова все еще можно вызвать.
#include
#include

struct X
{
void operator()()
{
++x; // Modifies state
std::println("{}", x);
}

int x{};
};

struct Foo
{
Foo(int x) { ::new (buf.data()) X{ x }; }

void operator()() const
{
auto* ptr{ static_cast(buf.data()) };
(*static_cast(const_cast(ptr)))();
}

std::array buf{};
};

int main()
{
const Foo foo{ 0 }; // foo is const
foo(); // modifies foo memory
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... d-behavior
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»