C++ 关于cppreference中const_cast的用法

C++ 关于cppreference中const_cast的用法,c++,C++,请参考下面的示例。 这是一个关于使用 struct type { type() :i(3) {} void m1(int v) const { // this->i = v; // compile error: this is a pointer to const const_cast<type*>(this)->i = v; // OK as long as the type object i

请参考下面的示例。 这是一个关于使用

struct type {
    type() :i(3) {}
    void m1(int v) const {
      // this->i = v;                 // compile error: this is a pointer to    const
      const_cast<type*>(this)->i = v; // OK as long as the type object isn't const
  }
   int i;
};
结构类型{
type():i(3){}
无效m1(内部v)常数{
//this->i=v;//编译错误:这是指向常量的指针
const_cast(this)->i=v;//只要类型对象不是const,就可以
}
int i;
};
const这里表示m1无法修改类型的成员变量。我不明白为什么const_cast会修改这个的constness。我的意思是,这个指针指向当前类型的对象,而不是I本身

为什么不:

const_cast<int>((this)->i) = v; 
const_cast((this)->i)=v;
我可以说,当一个成员函数使用常量限定符时,整个对象和所有成员变量都变成常量?为什么这是常量指针

我不明白为什么const_cast会修改这个常量

没有。您可以说它创建了另一个临时指针,它不是指向
常量类型的指针,而是包含与
this
相同的地址。然后它使用该指针访问
i

为什么不
const\u cast((这个)->i)

您可以这样做,但需要对引用进行转换,而不是普通整数

const_cast<int&>(i) = v; // this-> omitted for brevity
const_cast(i)=v;//为了简洁起见,省略了此选项
如果
指向一个实际常量的对象,则对
i
的任何修改都适用相同的注意事项

我可以说当一个成员函数使用常量修饰符时,整个对象和所有成员变量都变成常量吗?为什么这是常量指针

对。成员函数上的const限定符意味着
的指针对象类型是
类型const
。并且所有成员(不可变)对于通过
this
进行的任何访问也是常量

我不明白为什么const_cast会修改这个常量

没有。您可以说它创建了另一个临时指针,它不是指向
常量类型的指针,而是包含与
this
相同的地址。然后它使用该指针访问
i

为什么不
const\u cast((这个)->i)

您可以这样做,但需要对引用进行转换,而不是普通整数

const_cast<int&>(i) = v; // this-> omitted for brevity
const_cast(i)=v;//为了简洁起见,省略了此选项
如果
指向一个实际常量的对象,则对
i
的任何修改都适用相同的注意事项

我可以说当一个成员函数使用常量修饰符时,整个对象和所有成员变量都变成常量吗?为什么这是常量指针


对。成员函数上的const限定符意味着
的指针对象类型是
类型const
。所有成员(不可变)对于通过
this

进行的任何访问都是常量。对于常量转换(expr),如果newtype不是指针,是否应该始终是引用?@wason-使用常量转换创建指针或引用。事实上,只有施法指针才能创建临时指针。您不能执行
常量转换
,这是不允许的转换。“所以,这是一个没有起点的尝试。”沃森——我可以用TL来形容;博士版本。是的。当我使用const_cast时,我收到一条错误消息,说const_cast中的类型应该是指向对象类型的指针、引用或指向成员的指针。@wason-
const_cast(x)
,如果允许的话,会给你一个
x
的非常量副本。你已经可以通过
inty=x。对于const_cast(expr),如果不是指针,newtype是否应该始终是引用?@wason-您可以使用const_cast创建指针或引用。事实上,只有施法指针才能创建临时指针。您不能执行
常量转换
,这是不允许的转换。“所以,这是一个没有起点的尝试。”沃森——我可以用TL来形容;博士版本。是的。当我使用const_cast时,我收到一条错误消息,说const_cast中的类型应该是指向对象类型的指针、引用或指向成员的指针。@wason-
const_cast(x)
,如果允许的话,会给你一个
x
的非常量副本。你已经可以通过
inty=x。虽然您可以使用const_cast(根据Storyteller的回答),但我建议您将m1更改为非const,
void m1(int v){…
。通过声明方法const,您可以做出一个契约声明,说明该方法不会修改对象的状态。确保代码const正确非常重要(好吧,我想是的;有些人完全避免常量正确性),违反合同规定可能会导致令人不快的深夜调试会话。虽然你可以使用常量演员(根据讲故事者的回答),但我建议你将m1改为非常量,
void m1(int v){…
。通过声明method const,您就做出了一个契约性声明,表明该方法不会修改对象的状态。确保您的code const正确是很重要的(嗯,我认为是这样;有些人完全避免const正确性),违反契约性声明可能会导致令人不快的深夜调试会话。