operator new命名空间

时间:2011-06-02 05:48:10

标签: c++ namespaces new-operator compiler-bug

namespace X
{
  void* operator new (size_t);
}

将错误消息显示为:

error: ‘void* X::operator new(size_t)’ may not be declared within a namespace

gcc compiler bug吗?在较旧的gcc版本中它似乎正在工作。 任何想法,为什么不允许?

用例: 我想只允许自定义operator new/delete用于类,并且想要禁止全局new/operator。很容易发现编译器错误,而不是链接器错误;所以我编码:

namespace X {
  void* operator new (size_t);
}
using namespace X;

这适用于较旧版本的gcc,但不适用于新版本。

2 个答案:

答案 0 :(得分:9)

这是不允许的,因为它没有任何意义。例如,您有以下

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;
}

现在ptr应该delete如何使用全局命名空间operator delete()或特定于namespace X? C ++没有办法推断出它。

答案 1 :(得分:6)

如果我们从标准中考虑这一部分,@ Sharptooth的答案更有意义:

3.7.3.1分配函数[basic.stc.dynamic.allocation]

  

[..]分配函数应该是类成员函数或全局函数;如果在全局范围以外的命名空间范围内声明分配函数或在全局范围内声明为静态,则程序格式不正确。 [..]

上述限制可能是因为@ sharptooth的答案指出的原因。