Wikipedia声明:
A类型可以使用运算符new进行分配:
结构新{空*运算符NonNewable (std::size_t)=NonNewable;};
此类型的对象只能分配为堆栈对象或其他类型的成员。如果没有不可移植的技巧,它就不能直接堆分配。(由于放置new是在用户分配的内存上调用构造函数的唯一方法,而且如上所述,这种使用已被禁止,因此无法正确构造对象。)
删除操作符new类似于在当前C++中将其设置为私有,但不是显式地使用全局操作符new来避免特定于类的查找,仍然有效的C++0x吗?
NonNewable *p = ::new NonNewable();
// neither non-portable nor trickery, though perhaps not widely known
我是不是在草稿里漏掉了什么?
需要说明的是,这是有效的C++03和works fine
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;
}
发布于 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
,并且不会使程序格式错误。
https://stackoverflow.com/questions/3802454
复制相似问题