首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++0x是否仍然可以使用全局运算符new显式分配?

C++0x是否仍然可以使用全局运算符new显式分配?
EN

Stack Overflow用户
提问于 2010-09-27 17:21:22
回答 1查看 521关注 0票数 18

Wikipedia声明:

A类型可以使用运算符new进行分配:

结构新{空*运算符NonNewable (std::size_t)=NonNewable;};

此类型的对象只能分配为堆栈对象或其他类型的成员。如果没有不可移植的技巧,它就不能直接堆分配。(由于放置new是在用户分配的内存上调用构造函数的唯一方法,而且如上所述,这种使用已被禁止,因此无法正确构造对象。)

删除操作符new类似于在当前C++中将其设置为私有,但不是显式地使用全局操作符new来避免特定于类的查找,仍然有效的C++0x吗?

代码语言:javascript
复制
NonNewable *p = ::new NonNewable();
// neither non-portable nor trickery, though perhaps not widely known

我是不是在草稿里漏掉了什么?

需要说明的是,这是有效的C++03和works fine

代码语言:javascript
复制
struct NonNewable {
private:
  void *operator new(std::size_t);  // not defined
};

int main() {
  // ignore the leaks, it's just an example

  void *mem = operator new(sizeof(NonNewable));
  NonNewable *p = ::new(mem) NonNewable();

  p = ::new NonNewable();

  return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-28 01:41:47

我相信你是对的,维基百科是错的。C++0x草案标准将“删除的函数”(8.4p10)描述为不能以任何方式使用的函数(否则程序是病态的)。与普通函数不同,它们在作用域或名称查找中没有任何作用。关于新表达的相关段落保持不变:

5.3.4p8新表达式通过调用分配函数(3.7.4.1)获取对象的存储空间。..。

5.3.4p9如果new-expression以一元运算符::开头,则在全局范围内查找分配函数的名称。否则,如果所分配的类型是类类型T或其数组,则在T的作用域中查找分配函数的名称。如果这种查找无法找到名称,或者如果所分配的类型不是类类型,则在全局作用域中查找分配函数的名称。

所以,是的,表达式::new NonNewable::new(mem) NonNewable将选择::operator new重载,忽略函数NonNewable::operator new,并且不会使程序格式错误。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3802454

复制
相关文章

相似问题

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