2

我從來沒有完全理解運算符重載的參數列表是如何以系統的方式確定的,而且我對現在的問題特別困惑。運算符重載(特別是'new')參數如何工作?

當你重載一元運算符時,它有一個參數,或者如果它是一個類成員,則爲零。當你重載一個二元運算符時,它有兩個參數,或者一個是類成員。至少這是它看起來工作的方式。但是,我遇到了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的擴展。括號內的兩個問題可能是問題還是其他問題?

回答

0

重載運算符的參數數量是任何聲明。對於以符號(+)命名的運算符,如果將它們定義爲具有額外的參數,則只會通過顯式調用來調用它們。 (運算符+(a,b,c,d,e))。對於新操作員,您必須至少給出一個參數,但您可以根據需要多給它。常規運算符重載決定調用哪一個。

2

operator new更接近函數,因爲您可以根據需要提供儘可能多的重載,編譯器將根據函數過載規則選擇版本。

所以,當你做new ((T1)value1, (T2)value2) TYPE,將被路由到:

operator new(size_t, T1, T2); 

與宏的問題是,它是假設您呼叫的新的普通版本,它可以使用預處理程序把它變成調試新的調用。當您需要調用不同版本的新版本時,該宏會被破壞。

如果您需要調用放置新的(或任何其他特殊新),就可以解決您的問題通過關閉宏:

#undef new