【发布时间】:2020-02-21 06:22:09
【问题描述】:
在“C++ Primer 5th edition”中,第 12 章“动态内存和智能指针”说:
与任何其他 const 一样,必须初始化动态分配的 const 对象。定义默认构造函数(第 7.1.4 节,第 263 页)的类类型的 const 动态对象可以被隐式初始化。其他类型的对象必须显式初始化。因为分配的对象是 const,所以 new 返回的指针是指向 const 的指针(第 2.4.2 节,第 62 页)。
所以这样的陈述被认为是错误的:
const int* pi = new const int;
如果我在 GCC 上运行这个语句,它编译失败,但是为什么它在 MSVC14 上编译?
-
在我看来这是一个愚蠢的错误,指针是指向
const的指针,这意味着以后无法分配给它,访问它也是UB。
【问题讨论】:
-
非标准编译器扩展。 (错误/功能)
-
MSVC 并不是最符合标准的编译器。
-
从程序员的角度来看是愚蠢的?是的。从编译器的角度来看 - 不是那么多。只是另一个不合格的行为。
struct bar {}; new const bar;编译得很好。 -
@HansPassant:我认为在您的示例中这是未定义的行为,因为使用
const_cast抛弃了最初常量对象的常量性。 -
@HansPassant:但是 AFAIK 在指向 const 对象的指针上使用
const_cast来更改这些对象是 UB。不是吗??!!!
标签: c++ dynamic-memory-allocation