#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;
}
ここでは、機能foo
の2回目の呼び出しにnullptr
を渡すことによって解決することができるNULLポインタのために右のオーバーロードを選択すると、問題を、見ることができますを考えます私はほとんどの実装は、同じくらいの定数リテラル0
(#define NULL 0
)のようなNULL
を定義知っていたとして、しかし、私の質問は、したがって、第二コールは、このようなこと持つようにコンパイル時に期待されている、...
別の何かについてです - foo(0)
,
しかし、プリプロセッサは
int main()
{
foo(0);
foo(
# 25 "main.cpp" 3 4
__null
# 25 "main.cpp"
);
return 0;
}
ここ__null
何ですか(g++ -std=c++11 -E main.cpp -o main
を実行した後に)いくつかの奇妙な出力を提供します??
これは組み込みのint型ですか?
実装固有のようです( '__'に注意してください)。どのコンパイラを使用していますか? – user0042
@ user0042私は 'g ++ 5.4.0'を使っています – ampawd
https://gcc.gnu.org/onlinedocs/libstdc++/manual/support.html(最後の段落)つまり、' _null'という魔法のキーワードはあなたが見ているものを正確に阻止します(最初は '0'を整数とみなし、それを' nullptr'に変換するだけです)。 – Damon