C++ 常量强制转换不同的行为:基元类型与对象类型

C++ 常量强制转换不同的行为:基元类型与对象类型,c++,C++,如果我们将变量声明为常量,则即使通过非常量引用,其内容也不得更改。在下面的代码中,我不明白为什么会根据类型(原语vs对象)得到不同的行为: #包括 类MyClass { 公众: int m_值; MyClass(int值):m_值(value){}; } int main() { 常数int x=0; const_cast(x)=20; std::cout您不能丢弃常量变量x的常量,因为变量x是常量变量 const\u cast实际上要做的是扔掉const指针或引用,因为您的成员m\u valu

如果我们将变量声明为常量,则即使通过非常量引用,其内容也不得更改。在下面的代码中,我不明白为什么会根据类型(原语vs对象)得到不同的行为:

#包括
类MyClass
{
公众:
int m_值;
MyClass(int值):m_值(value){};
}
int main()
{
常数int x=0;
const_cast(x)=20;

std::cout您不能丢弃常量变量x的常量,因为变量x是常量变量

const\u cast
实际上要做的是扔掉const指针或引用,因为您的成员
m\u value
不是const成员,您可以使用
const\u cast

intx=0;
常数int&p=x;
//p=20;//错误:p是常量
const_cast(p)=20;

std::你能有一个常量对象,调用一个标记为
const
的函数,然后扔掉这个常量来修改这个对象吗?为什么?你这样做的原因是什么?纯粹的好奇?或者你想解决一些潜在的问题吗?如果有潜在的问题,请直接询问因为你的代码修改了一个const对象,它有未定义的行为。C++中没有规则来说明它应该如何运行。如果你真的想知道为什么会有差别,那么你需要看看你的编译器以及它的works.const MyClass A(0),除了任何类成员声明了可变([dCL,STC])之外。可以修改,在常量对象([basic.type.qualifier])的生存期([basic.life])内修改([expr.ass]、[expr.post.incr]、[expr.pre.incr])的任何尝试导致未定义的行为:。因此,我得到的只是编译器的行为,在不同的编译器上可能会有所不同。这是错误的。
m_值作为更大整体的一部分也是常量。这只是未定义的行为,没有“解释”或者允许这样做。是的,只是错了。如果一个对象是常量,那么它的所有数据成员也是常量(除非它们被声明为可变的)。但是如果一个对象被声明为常量,这不意味着它的所有成员都是常量吗?
#include <iostream>

class MyClass 
{

public:   

   int m_value ;
   MyClass(int value): m_value(value) {} ;


}

int main()
{
 const int x = 0 ;
 const_cast<int &>(x)=20 ;
 std::cout << x << std::endl ; //output 0

 const MyClass a(0) ;
 const_cast<MyClass&>(a).m_value= 20 ;
 std::cout << a.m_value << std::endl ; //output 20 

}
 int x = 0 ;
 const int& p = x; 
 // p = 20; // error: p is const
 const_cast<int &>(p)=20 ;
 std::cout << p << std::endl ; //output 20

-------------------------------------------
int main(){
  const MyClass a;
  const_cast<MyClass&>(a).m_value= 20 ;// undefined behavior
}