命名空间内的 new 运算符

发布于 2024-11-10 17:51:30 字数 586 浏览 4 评论 0原文

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,但不适用于新版本。

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

gives error message as:

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

Is it a gcc compiler bug ? In older gcc version it seems to be working.
Any idea, why it's not allowed ?

Use case:
I wanted to allow only custom operator new/delete for the classes and wanted to disallow global new/operator. Instead of linker error, it was easy to catch compiler error; so I coded:

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

This worked for older version of gcc but not for the new one.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

李白 2024-11-17 17:51:31

这是不允许的,因为它没有意义。例如

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 应该如何deleted - 使用全局命名空间operator delete() 或特定于 代码>命名空间X? C++ 无法推断出这一点。

This is not allowed because it makes no sense. For example you have the following

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

now how should the ptr be deleted - with global namespace operator delete() or with the one specific to namespace X? There's no possible way for C++ to deduce that.

风渺 2024-11-17 17:51:31

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

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

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

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

@Sharptooth's Answer makes more sense if we consider this section from the standard:

3.7.3.1 Allocation functions [basic.stc.dynamic.allocation]

[..] An allocation function shall be a class member function or a global function; a program is ill-formed if an allocation function is declared in a namespace scope other than global scope or declared static in global scope. [..]

The above limitation is probably imposed for the very reason that @sharptooth's answer points out.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文