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)
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.)
| 归档时间: |
|
| 查看次数: |
4057 次 |
| 最近记录: |