在C++中,堆栈分配的对象可以声明为const
const Class object;
在那之后,试图在这样的对象上调用非常量方法是未定义的行为:
const_cast<Class*>( &object )->NonConstMethod(); //UB
堆分配的对象可以被const
并产生相同的结果吗?我的意思是,是否有可能出现以下情况:
const Class* object = new Class();
const_cast<Class*>( object )->NonConstMethod(); // can this be UB?
也是未定义的行为吗?
发布于 2009-12-18 19:08:00
是。构造和销毁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;
}
发布于 2009-12-18 19:23:49
可以,堆分配的对象可以是const。考虑7.1.5.1/5中的示例摘录:
const int* ciq = new const int (3); // initialized as required
int* iq = const_cast<int*>(ciq); // cast required
*iq = 4; // undefined: modifies a const object
您在问题中给出的示例很好用,因为您并没有要求new
创建一个const对象;您只是将结果存储在指向const的指针中。
发布于 2009-12-18 19:22:41
显然:
struct Foo {
const int Bar;
Foo() : Bar(42) { }
};
Foo* foo = new Foo;
const_cast<int&>(foo->Bar); // don't do this.
https://stackoverflow.com/questions/1927477
复制相似问题