Глядя на этот пример: 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