【问题标题】:How does operator overloading (especially 'new') arity work?运算符重载(尤其是“新”)arity 是如何工作的?
【发布时间】:2011-01-16 09:05:43
【问题描述】:

我一直不太了解运算符重载的参数列表是如何以系统方式确定的,而且我对我现在遇到的一个问题感到特别困惑。

当你重载一个一元运算符时,它有一个参数,如果它是一个类成员则为零。当您重载二元运算符时,它有两个参数,或者如果它是类成员则有一个。至少它看起来是这样工作的。但是,operator new(不是班级成员)有问题。

在我工作的代码库中,就像我过去见过的其他地方一样(例如here),有一个类似#define new new(__FILE__, __LINE__) 的定义和一个带有签名void *new(size_t size, const char *file, unsigned line) 或其他东西的相应函数喜欢它用于内存调试。我注意到我项目中的那个实际上与之前链接的那个不同。这对我来说是个问题,因为出于某种原因它搞砸了新的展示位置。我查看了C++ 编程语言,如果它解释了这一点,我就错过了。

new 在这方面是否特别,即它是否具有特定语言定义的额外调试签名?看起来不像是因为,正如我上面提到的,我在不同的地方看到了稍微不同的签名。如果有,还有哪些其他运营商有非显而易见的签名,它们是什么?这些不同的签名是不是一些特定于实现的附加功能?如果是这样,是否有关于大多数实现的一般规则?或者,这是否像我在标题中暗示的那样是一个问题?您可以在签名中添加任意数量的额外参数吗?如果您使用 new 关键字本身和您想要的新类型之间的参数调用 new ,您可以做任何事情?还是我更加困惑,还有什么我遗漏的?

最重要的是在短期内(虽然我真的很想了解这一点),我的位置new 是怎么回事?该宏正在导致类似new ("file.cpp", 100) (class_pointer) class_t 的扩展。可能是括号中的两组问题,还是其他问题?

【问题讨论】:

    标签: c++ debugging operator-overloading new-operator placement-new


    【解决方案1】:

    operator new 更接近函数,因为您可以提供任意数量的重载,编译器将根据函数重载规则选择版本。

    因此,当您执行new ((T1)value1, (T2)value2) TYPE 时,它将被路由到:

    operator new(size_t, T1, T2);
    

    您的宏的问题在于它假设您正在调用 new 的普通版本,并且它可以使用预处理器将其转换为对调试 new 的调用。当您需要调用不同版本的 new 时,宏会损坏。

    如果您需要调用placement new(或任何其他特殊的new),您可以通过关闭该宏来解决您的问题:

    #undef new
    

    【讨论】:

      【解决方案2】:

      重载运算符的数量是您声明的任何内容。对于以符号 (+) 命名的运算符,如果您将它们定义为具有额外的参数,它们将只能通过显式调用来调用。 (运算符+(a,b,c,d,e))。对于 operator new,您必须至少给它一个 arg,但您可以给它任意数量。常规运算符重载决定了调用哪个运算符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        • 2020-09-20
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-07
        相关资源
        最近更新 更多