C++ 常量强制转换不同的行为:基元类型与对象类型
如果我们将变量声明为常量,则即使通过非常量引用,其内容也不得更改。在下面的代码中,我不明白为什么会根据类型(原语vs对象)得到不同的行为: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
#包括
类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
}