【发布时间】:2014-05-12 23:24:14
【问题描述】:
所以this answer 让我想到了将new 的结果分配给指向const 的指针的场景。 AFAIK,没有理由你不能合法地 const_cast constness 在这种情况下实际修改对象:
struct X{int x;};
//....
const X* x = new X;
const_cast<X*>(x)->x = 0; // okay
但后来我想 - 如果你真的想要 new 创建一个 const 对象怎么办。所以我尝试了
struct X{};
//....
const X* x = new const X;
它编译好了!!!
这是 GCC 扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。
【问题讨论】:
-
new obviously doesn't create a const object.为什么这么说? -
@LightnessRacesinOrbit 已编辑。
-
new doesn't create a const object为什么这么说? -
在 Luchian 得到他的启示之前,如果
T是一个非 const 限定类型并且你写const T *ptr = new T;,那么new显然没有' t 创建一个 const 对象 :-) 在这种情况下,将 const 从ptr中转换出来并使用结果来修改对象是合法的。 -
@SteveJessop:当然,但这与
new无关。就像int obj = 2; const int* ptr = &obj; *const_cast<int*>(ptr) = 3;我在这里没有看到任何令人惊讶的地方。
标签: c++ constants language-lawyer