首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >堆分配的对象在C++中可以是常量吗?

堆分配的对象在C++中可以是常量吗?
EN

Stack Overflow用户
提问于 2009-12-18 18:45:13
回答 4查看 5K关注 0票数 20

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

代码语言:javascript
复制
const Class object;

在那之后,试图在这样的对象上调用非常量方法是未定义的行为:

代码语言:javascript
复制
const_cast<Class*>( &object )->NonConstMethod(); //UB

堆分配的对象可以被const并产生相同的结果吗?我的意思是,是否有可能出现以下情况:

代码语言:javascript
复制
const Class* object = new Class();
const_cast<Class*>( object )->NonConstMethod(); // can this be UB?

也是未定义的行为吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-18 19:08:00

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

代码语言:javascript
复制
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;
}
票数 20
EN

Stack Overflow用户

发布于 2009-12-18 19:23:49

可以,堆分配的对象可以是const。考虑7.1.5.1/5中的示例摘录:

代码语言:javascript
复制
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的指针中。

票数 2
EN

Stack Overflow用户

发布于 2009-12-18 19:22:41

显然:

代码语言:javascript
复制
struct Foo {
  const int Bar;
  Foo() : Bar(42) { }
};

Foo* foo = new Foo;
const_cast<int&>(foo->Bar); // don't do this.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1927477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档