Search code examples
c++constantsconst-correctnessundefined-behavior

Can a heap-allocated object be const in C++?


In C++ a stack-allocated object can be declared const:

const Class object;

after that trying to call a non-const method on such object is undefined behaviour:

const_cast<Class*>( &object )->NonConstMethod(); //UB

Can a heap-allocated object be const with the same consequences? I mean is it possible that the following:

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

is also undefined behaviour?


Solution

  • Yes. It's legal to construct and destroy a const heap object. As with other const objects, the results of manipulating it as a non-const object (e.g. through a const_cast of a pointer or reference) causes undefined behaviour.

    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;
    }