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

给出错误信息:

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

它是gcc 编译器错误吗?在较旧的 gcc 版本中,它似乎正在工作。任何想法,为什么不允许?

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

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

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

4

2 回答 2

11

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

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++ 无法推断出这一点。

于 2011-06-02T05:52:37.290 回答
6

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

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

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

上述限制可能是由于@sharptooth 的回答指出的原因而施加的。

于 2011-06-02T05:57:58.043 回答