根据C ++ 11,下面的代码是否构成“未定义的行为”(由于使用了const_cast,请参阅下面的引用)?
const void* p = operator new(123);
operator delete(const_cast<void*>(p));
C ++ 11标准(3.7.4.2.3)的相关引用:
提供给释放函数的第一个参数的值可以是空指针值;如果是这样,并且如果解除分配功能是标准库中提供的功能,则该呼叫没有效果。否则,如果标准库中提供给
operator delete(void*)
的值不是先前在标准库中调用operator new(std::size_t)
或operator new(std::size_t, const std::nothrow_t&)
返回的值之一,则行为未定义
如果答案是否定的,请提供C ++ 11标准中的引号来确认。
答案 0 :(得分:4)
这不是未定义的。原因是:
operator new
返回void*
,因此保证返回可修改的(非常量)内存:[support.dynamic]
void* operator new(std::size_t size);
const_cast
如果引用的对象不是const,则抛弃constness是有效的:[expr.const.cast]§7,引用[dcl.type.cv],特别是§3+ 4
3指向cv限定类型的指针或引用不需要实际指向或引用cv限定对象,但它 被视为好像;即使对象,也不能使用const限定的访问路径来修改对象 referenced是一个非const对象,可以通过其他一些访问路径进行修改。
4除了可以修改声明
mutable
(7.1.1)的任何类成员外,任何修改const的尝试都是如此 对象在其生命周期(3.8)中导致未定义的行为。
const_cast
不会修改操作数的值:[expr.const.cast]§3:
...指针的结果
const_cast
指的是原始对象。