C++ C++;无法删除递归中对象的常量

C++ C++;无法删除递归中对象的常量,c++,constants,const-cast,C++,Constants,Const Cast,我有下面的功能 class p{ public : string const& PrintData() const { cout << "const" << str; const_cast<ConstFunctions *>(this); PrintData(); return str; } string const& PrintData() { cout << "non-const" <

我有下面的功能

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();
}
p类{
公众:
字符串常量&PrintData()常量
{

cout
p1
const
,因此它调用:

string const& PrintData() const
在这个函数中,您调用
PrintData
,但由于您在
const
函数中,编译器将调用
const
版本,这将导致递归循环

该行:

const_cast<ConstFunctions *>(this);
const_cast(本);
实际上不做任何事情,因为您的类在其类型层次结构中没有此类型,而且您也没有对中进行任何操作

如果确实要调用非常量版本,请执行以下操作:

const_cast<p*>(this)->PrintData();
const_cast(this)->PrintData();

但你真的应该问问自己为什么要这么做…

p1
const
,所以它调用:

string const& PrintData() const
在这个函数中,您调用
PrintData
,但由于您在
const
函数中,编译器将调用
const
版本,这将导致递归循环

该行:

const_cast<ConstFunctions *>(this);
const_cast(本);
实际上不做任何事情,因为您的类在其类型层次结构中没有此类型,而且您也没有对中进行任何操作

如果确实要调用非常量版本,请执行以下操作:

const_cast<p*>(this)->PrintData();
const_cast(this)->PrintData();

但是你真的应该问问自己为什么要这样做…

语句
const\u cast(this);
没有做任何有用的事情。它执行
const\u cast
并简单地丢弃结果。编译器很可能会优化它

然后执行递归调用,它只调用自身,而不是非常量函数

你可能是有意的

const_cast<p*>(this)->PrintData();
const_cast(this)->PrintData();

语句
const_cast(this);
没有任何用处。它执行
const_cast
并简单地丢弃结果。编译器很可能会对其进行优化

然后执行递归调用,它只调用自身,而不是非常量函数

你可能是有意的

const_cast<p*>(this)->PrintData();
const_cast(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;
}
this
指针始终携带调用对象的
cv
限定。请参阅

您要做的是抛弃
this
cv
限制,并使用生成的
this
调用非常量版本

string const& PrintData() const
{
    cout << "const" << str;
    return const_cast<p*>(this)->PrintData();
}
string常量和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;
}
this
指针始终携带调用对象的
cv
限定。请参阅

您要做的是抛弃
this
cv
限制,并使用生成的
this
调用非常量版本

string const& PrintData() const
{
    cout << "const" << str;
    return const_cast<p*>(this)->PrintData();
}
string常量和PrintData()常量
{

cout“编译器很可能会优化掉它。”编译器绝对会“优化掉它”,因为它实际上无法为该语句创建有意义的代码。它在翻译的/“编译”程序中没有类似的代码。或者
const_cast(this)->PrintData()
实际上(不知道
ConstFunctions
是什么)如果我想永久删除对象的恒定性怎么办?有可能吗?@raghureddy这是不可能的。感谢您的快速响应。我将对此做更多的研究“编译器很可能会优化它”。编译器绝对会“优化它”,因为它实际上无法为该语句创建有意义的代码。它在翻译的/“编译”程序中没有类似的代码。或者
const_cast(this)->PrintData()
实际上(不知道
ConstFunctions
是什么)如果我想永久移除物体的恒常性呢?有可能吗?@raghureddy这是不可能的。谢谢,谢谢你的快速反应。我会对此做更多的研究。谢谢,这非常有帮助。谢谢,这非常有帮助。谢谢,这非常有帮助。谢谢,这非常有帮助。