gpt4 book ai didi

c++ - 运算符重载(尤其是 'new' )是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:58 25 4
gpt4 key购买 nike

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

当您重载一元运算符时,它有一个参数,如果它是类成员则为零。当您重载一个二元运算符时,它有两个参数,如果它是类成员,则有一个。至少这就是它看起来的工作方式。但是,我遇到了 operator new(不是类成员)的问题。

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

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

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

最佳答案

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

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

operator new(size_t, T1, T2);

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

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

#undef new

关于c++ - 运算符重载(尤其是 'new' )是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2255752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com