C++ не может удалить константу объекта в рекурсивном
У меня есть функция ниже
class p{
public :
string const& PrintData() const
{
cout << "const" << str;
const_cast<ConstFunctions *>(this);
PrintData();
return str;
}
string const& PrintData()
{
cout << "non-const" << endl;
return str;
}
private :
string str="Hello";
}
int main()
{
const p p1;
p1.PrintData();
}
Я ожидаю ниже:
constHello не constHello
Потому что я удалил постоянство объекта
Но я вхожу в бесконечный рекурсивный цикл
3 ответа
Заявление const_cast<ConstFunctions *>(this);
не делает ничего полезного. Это делает const_cast
и просто выбрасывает результат. Компилятор, скорее всего, оптимизирует его.
Затем вы делаете рекурсивный вызов, который будет вызывать сам себя, а не неконстантную функцию.
Вы, вероятно, хотели сделать
const_cast<p*>(this)->PrintData();
Эта строка...
string const& PrintData() const
{
cout << "const" << str;
const_cast<ConstFunctions *>(this); //It doesn't work this way, you didn't use the result
PrintData(); //THis causes a recursive loop
return str;
}
У вас есть рекурсивная проблема, вы не уловили возвращаемое значение const_cast
следовательно, результат был отброшен, и компилятор оптимизирует эту строку.
Видите, всякий раз, когда вы вызываете функцию-член, как PrintData()
в вашем коде это называется так
this->PrintData();
//actually, like
p::PrintData( /*cv*/ this); //The cv qualification of 'this' depends on the cv of the object, in your case, const
this
указатель всегда несет cv
квалификация вызывающего объекта. Смотрите, что означает "cv-unqualified" в C++?
Что вы хотите сделать, это выбросить cv
квалификации this
и использовать полученный this
вызвать неконстантную версию
string const& PrintData() const
{
cout << "const" << str;
return const_cast<p*>(this)->PrintData();
}
p1
является const
так он называет:
string const& PrintData() const
В этой функции вы вызываете PrintData
, но потому что вы находитесь в const
Функция компилятор будет выглядеть, чтобы вызвать ваш const
версия, которая вызовет рекурсивный цикл.
Линия:
const_cast<ConstFunctions *>(this);
На самом деле ничего не делает, так как у вашего класса нет этого типа в иерархии типов, и вы также ничего не делаете с in.
Если вы действительно хотите вызвать неконстантную версию, выполните:
const_cast<p*>(this)->PrintData();
Но вы должны спросить себя, почему вы пытаетесь это сделать...