全局分配函数和const void*
Global allocation functions and const void*
下面的代码是否根据C++11构成了"未定义的行为"(由于使用了const_cast,请参阅下面的引号(?
const void* p = operator new(123);
operator delete(const_cast<void*>(p));
C++11标准(3.7.4.2.3(中的相关引用:
提供给解除分配函数的第一个参数的值可能是空指针值;如果是这样,并且deallocation函数是标准库中提供的函数,则该调用无效。否则,如果提供给标准库中
operator delete(void*)
的值不是标准库中先前调用operator new(std::size_t)
或operator new(std::size_t, const std::nothrow_t&)
返回的值之一,则行为将被取消定义
如果答案是否定的,请提供C++11标准中的报价来证实这一点。
它不是未定义的。理由是:
-
operator new
返回void*
,因此保证返回可修改(非常量(内存:[support.dynamic]void* operator new(std::size_t size);
-
如果引用的对象不是const:[expr.const.cast]§7,引用[dcl.type.cv],特别是§3+4 ,则抛出constness的
const_cast
是有效的3指向cv限定类型的指针或引用实际上不需要指向或引用cv限定对象,但它被视为确实如此;const限定的访问路径不能用于修改对象,即使该对象被引用是一个非常量对象,可以通过其他访问路径进行修改。
4除了声明为
mutable
(7.1.1(的任何类成员都可以修改外,任何修改常量的尝试对象在其生存期内(3.8(会导致未定义的行为。 -
const_cast
不修改操作数的值:[expr.const.cast]§3:指针的结果
const_cast
是指原始对象。
相关文章:
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 从"const void*"到"PVOID {aka void*}"[-fall
- 将返回类型专用化为 void 或 const 左值引用
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 错误:从'void*'到'const uint8_t* {aka const unsigned char*}'的转换无效 [-允许]
- template<class T, int N> void h(T const(&)[N]); as friend function
- 'void (*)(const char*)' 'void (*)()' [-允许]
- 从 'void *' 转换为 'const std::string *&' 必须具有所有中间指针 const 合格
- Python ctypes and void const pointers
- Casting a const void*
- SFML 和 Box2D SetUserData 无法将参数从 const char [4] 转换为 void *
- 警告:'virtual void wxWindowBase::SetInitialBaseSize(const wxSize&)'已弃用
- typedef void (*print_type) (const char*);
- :void setData(const Color * & data_ptr)中的 *& 是什么意思;
- 将所有权从 unique_ptr<T,void(*)(T*)> 转移到 unique_ptr<const T,void(*)(const T*>
- 使用 LLVM 从 const void * 转换为模板类型时出现问题
- 将 std::function 作为参数传递,const void *
- 了解 void f(const T¶m) 中的参数类型
- CA::release_objects(X::List<void const*>*)