Я читал этот вопрос здесь здесь относительно константности. Решение Скотта Мейера кажется хорошим обходным путем, но что, если у вас есть функция-член (для которой требуется как постоянная, так и неконстантная версия), которая использует указатель this
. Если функция-член const
, то this
автоматически означает const this
, что может затруднить создание единственной функции const
, в которой находится основная часть кода.
Один из возможных обходных путей, который мне приходил в голову, заключался в простой передаче ссылки на this
в функцию const в качестве параметра, поэтому функция может использовать эту ссылку вместо прямого использования указателя this
. Но это безопасно? Это кажется безопасным (хотя и очень хакерским), потому что вы на самом деле не используете const_cast
для const-объекта. Скорее вы просто обойдете договор, предоставленный функцией-членом const
, передав ему неконстантную ссылку на объект.
Например:
class Foo
{
private:
template <class SelfReference>
void f1(SelfReference& self) const
{
// We now might have a non-const reference to "this", even though
// we're in a const member function. But is this safe???
}
public:
void f2()
{
f1(*this);
}
void f2() const
{
f1(*this);
}
};
Похоже, это хороший способ избежать дублирования большого количества кода, когда требуется постоянная и неконстантная версия функции, но безопасно ли это? Или это как-то вызывает неопределенное поведение?