2
#include <iostream>
void foo(int* p)
{
std::cout << "pointer" << '\n';
}
void foo(int p)
{
std::cout << "value" << '\n';
}
int main()
{
foo(0); // value
foo(NULL); // error: call of overloaded ‘foo(NULL)’ is ambiguous foo(NULL);
return 0;
}
在這裏我們可以看到一個問題,選擇了空指針向右過載,這可以通過傳遞nullptr
的功能foo
的第二個電話來解決,但我的問題是關於不同的東西......
,因爲我知道大多數實現定義NULL
只是一個常量文字0
像(#define NULL 0
),因此預計在編譯時有第二個呼叫是這樣的 - foo(0)
,
但預處理器給出了一些奇怪的輸出(運行g++ -std=c++11 -E main.cpp -o main
後)
int main()
{
foo(0);
foo(
# 25 "main.cpp" 3 4
__null
# 25 "main.cpp"
);
return 0;
}
什麼是__null
這裏?
這是一個內置的int類型?
看起來像那是特定實現(注意'__')。你正在使用哪種編譯器? – user0042
@ user0042我使用'g ++ 5.4.0' – ampawd
https://gcc.gnu.org/onlinedocs/libstdc++/manual/support.html(最後一段)換句話說,'_null' magic關鍵字應該是準確地阻止你看到的內容(首先將'0'視爲整數,然後將其轉換爲'nullptr')。 – Damon