【发布时间】:2017-11-11 14:44:41
【问题描述】:
考虑代码
#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 我正在使用
g++ 5.4.0 -
gcc.gnu.org/onlinedocs/libstdc++/manual/support.html (最后一段)换句话说,
_null魔术关键字应该完全防止您看到的内容(首先将0视为整数,然后才将其转换为nullptr). -
NULL的内容是实现定义的。所以看起来 gcc 只是使用了某种内在函数。 -
@VTT — 它是特定于实现的,但没有定义实现。标准中“定义的实现”意味着实现需要记录它的作用。
标签: c++ c++11 null g++ null-pointer