17 c++ new-operator c++11
维基百科说:
使用operator new无法分配类型:
Run Code Online (Sandbox Code Playgroud)struct NonNewable { void *operator new(std::size_t) = delete; };
此类型的对象只能作为堆栈对象或另一种类型的成员分配.没有非便携技巧,它不能直接堆分配.(由于placement new是在用户分配的内存上调用构造函数的唯一方法,并且如上所述禁止使用此对象,因此无法正确构造对象.)
删除operator new类似于在当前C++中将其设为私有,但是没有显式使用全局运算符new,这避免了特定于类的查找,仍然是有效的C++ 0x?
NonNewable *p = ::new NonNewable();
// neither non-portable nor trickery, though perhaps not widely known
Run Code Online (Sandbox Code Playgroud)
我错过了选秀中的一些内容吗?
要清楚,这是有效的C++ 03并且工作正常:
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;
}
Run Code Online (Sandbox Code Playgroud)
我相信你是对的,维基百科是错的.C++ 0x草案标准将"已删除的函数"(8.4p10)描述为可能无法以任何方式使用的函数(或者程序格式错误).它们不参与范围或名称查找,与普通函数不同.关于新表达的有关段落保持不变:
[5.3.4p8] new-expression通过调用分配函数(3.7.4.1)获取对象的存储空间....
[5.3.4p9]如果new-expression以unary :: operator开头,则在全局范围内查找分配函数的名称.否则,如果分配的类型是类类型T或其数组,则在T的范围内查找分配函数的名称.如果此查找未能找到名称,或者如果分配的类型不是类类型,则分配函数的名称在全局范围内查找.
所以是的,表达式::new NonNewable
[或::new(mem) NonNewable
]将选择一个重载::operator new
,忽略该函数NonNewable::operator new
,并且不会使程序格式错误.
归档时间: |
|
查看次数: |
510 次 |
最近记录: |