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();

Но вы должны спросить себя, почему вы пытаетесь это сделать...

Другие вопросы по тегам