C++标准说,修改最初声明为const
的对象是未定义的行为。但是,构造函数和析构函数如何运行?
class Class {
public:
Class() { Change(); }
~Class() { Change(); }
void Change() { data = 0; }
private:
int data;
};
//later:
const Class object;
//object.Change(); - won't compile
const_cast<Class&>( object ).Change();// compiles, but it's undefined behavior
我的意思是,构造函数和析构函数的作用与调用代码完全相同,但是允许它们更改对象,并且不允许调用者-他会遇到未定义的行为。
在实现情况下并根据标准应如何工作?
最佳答案
该标准明确允许构造函数和析构函数处理const
对象。从12.1/4“构造函数”开始:
和12.4/2“析构函数”:
作为背景,Stroustrup在“C++的设计和演化”(13.3.2定义const
的细化)中说: