堆分配的对象可以在C++中是const吗?

sha*_*oth 19 c++ const const-correctness undefined-behavior

在C++中,可以声明堆栈分配的对象const:

const Class object;
Run Code Online (Sandbox Code Playgroud)

之后尝试在这样的对象上调用非const方法是未定义的行为:

const_cast<Class*>( &object )->NonConstMethod(); //UB
Run Code Online (Sandbox Code Playgroud)

堆分配的对象可以const具有相同的后果吗?我的意思是有可能是以下几点:

const Class* object = new Class();
const_cast<Class*>( object )->NonConstMethod(); // can this be UB?
Run Code Online (Sandbox Code Playgroud)

还是未定义的行为?

CB *_*ley 19

是.构造和销毁const堆对象是合法的.与其他const对象一样,将其作为非const对象(例如通过const_cast指针或引用)进行操作的结果会导致未定义的行为.

struct C
{
        C();
        ~C();
};

int main()
{
        const C* const p = new const C;

        C* const q = const_cast<C*>(p); // OK, but writes through q cause UB

        // ...

        delete p; // valid, it doesn't matter that p and *p are const

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 整齐!我不知道`const`可以和`new`这样使用. (5认同)
  • 如果你是一个const方法或者给了一个指针或对const的引用而你*知道*对象本身实际上不是const那么抛弃const就是合法的.它通常是一种解决方法. (2认同)
  • AFAIK const_cast的预期用例是抛弃const以将事物传递给不使用const的遗留代码,即使它不修改任何东西 (2认同)

Gre*_*ill 11

在您的堆示例中,new返回指向非const的指针.您将它存储在指向const的指针(然后将其const_cast编辑回指向非const的指针)的事实并没有改变对象本身不是const的事实,就像堆栈分配的那样是.

但是,您可以在堆上创建一个const对象:

const Class* object = new const Class();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,转换为指向非const的指针并调用非const方法将与const堆栈分配的对象相同.

(在堆上创建一个const对象的想法对我来说是新的,我以前从未见过.感谢Charles Bailey.)

  • 您可以通过const指针和指向const的指针_can_ delete. (5认同)