Я считаю, что это не UB, потому что сам указатель не является константой, и я не изменяю объект "foo".
Это правильно. Указатель не const
, поэтому вы можете изменить его так, чтобы он указывал на что-то другое, если хотите. В этом случае это не приведет к утечке памяти, но помните, что если указатель указывает на данные, выделенные с помощью new
, и это единственный указатель на эти данные, то вам нужно вызвать delete
перед переназначением указателя, иначеесть утечка памяти.
Дополнительный вопрос: а удаление констант указателя? Будет UB?
Это только UB, если вы попытаетесь изменить объект const
, из которого вы удалили const
, что вы и делаете в этом случае. Простое удаление const
хорошо, а иногда и необходимо, но вам никогда не разрешено изменять объект, если это не было const
с самого начала. Например, следующее допустимо, поскольку foo
не является const
.
int foo = 42;
void bar(int const& baz) { const_cast<int&>(baz) = 21; }
int main()
{
bar(foo);
}
, с другой стороны
const int foo = 42;
void bar(int const& baz) { const_cast<int&>(baz) = 21; }
int main()
{
bar(foo);
}
не разрешено, поскольку foo
является const