iam*_*ind 7 c++ namespaces new-operator compiler-bug
namespace X
{
void* operator new (size_t);
}
Run Code Online (Sandbox Code Playgroud)
给出错误消息:
error: ‘void* X::operator new(size_t)’ may not be declared within a namespace
Run Code Online (Sandbox Code Playgroud)
这是一个gcc编译器错误吗?在较旧的gcc版本中它似乎正在工作.任何想法,为什么不允许?
使用案例:我想只允许自定义operator new/delete类,并希望禁止全局new/operator.很容易发现编译器错误,而不是链接器错误; 所以我编码:
namespace X {
void* operator new (size_t);
}
using namespace X;
Run Code Online (Sandbox Code Playgroud)
这适用于较旧版本的gcc,但不适用于新版本.
这是不允许的,因为它没有任何意义.例如,您有以下内容
int* ptr = 0;
namespace X {
void* operator new (size_t);
void operator delete(void*);
void f()
{
ptr = new int();
}
}
void f()
{
delete ptr;
ptr = 0;
}
Run Code Online (Sandbox Code Playgroud)
现在应该如何ptr来deleteð -与全局命名空间operator delete()或与一个特定的namespace X?C++没有办法推断出这一点.
如果我们从标准中考虑这一部分,@ Sharptooth的答案更有意义:
3.7.3.1分配函数[basic.stc.dynamic.allocation]
[..]分配函数应该是类成员函数或全局函数; 如果在全局范围以外的命名空间范围内声明分配函数或在全局范围内声明为静态,则程序格式不正确.[..]
上述限制可能是因为@ sharptooth的回答指出的原因.