那么构造函数和析构函数如何使用写访问操作

那么构造函数和析构函数如何使用写访问操作

本文介绍了如果更改const对象是未定义的行为,那么构造函数和析构函数如何使用写访问操作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

C ++标准说,修改最初声明为 const 的对象是未定义的行为。

  class Class {
public:
Class(){更改(); }
〜Class(){Change(); }
void Change(){data = 0; }
private:
int data;
};

//以后:
const类对象;
//object.Change(); - 不会编译
const_cast< Class&>(object).Change(); //编译,但它是未定义的行为

我的意思是这里的构造函数和析构函数与调用代码完全相同,但是它们允许改变对象,调用者不允许 - 他运行到未定义的行为。

解决方案

p>

标准明确允许构造函数和析构函数处理 const 对象。从12.1 / 4构造函数:

和12.4 / 2Destructors

作为背景,Stroustrup在Design和C ++的演变(13.3.2定义 const 的细化):


C++ standard says that modifying an object originally declared const is undefined behavior. But then how do constructors and destructors operate?

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

I mean here the constructor and destructor do exactly the same thing as the calling code, but they are allowed to change the object and the caller is not allowed - he runs into undefined behavior.

How is it supposed to work under an implementation and according to the standard?

解决方案

The standard explicitly allows constructors and destructors to deal with const objects. from 12.1/4 "Constructors":

And 12.4/2 "Destructors":

As background, Stroustrup says in "Design and Evolution of C++" (13.3.2 Refinement of the Defintion of const):

这篇关于如果更改const对象是未定义的行为,那么构造函数和析构函数如何使用写访问操作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-01 02:41