我最近偶然发现了一些奇怪的事情:将一个布尔值转换为指针可在Visual Studio 2013和2015中工作,但不能在GCC和Clang(3.5中尝试)中使用。将bool(false)转换为C++中的合法指针吗?
#include <iostream>
using namespace std;
void foo(int *ptr)
{
std::cout << "foo";
}
int main()
{
foo(false);
}
错误GCC:
main.cpp: In function 'int main()':
main.cpp:13:13: error: cannot convert 'bool' to 'int*' for argument '1' to 'void foo(int*)'
foo(false);
^
我的猜测是虚假转换为0这相当于NULL。将呼叫替换为foo与foo(true)
会导致编译失败,每个编译器都会失败。
所以我的问题是:这段代码应该编译?我没有看到将false转换为指针的好处,但在我看来,这只会是滥用/重构等错误的原因。
相关:[防止虚假到指针无声铸(http://stackoverflow.com/q/21025179/3425536) – emlai
@DieterLücking我不认为这是重复的,OP想知道的是它允许和哪个编译器(gcc,clang,vc)是正确的。 – songyuanyao
该死的,我没有找到它,并没有找到任何相关的东西。尽管它有效吗?如果是这样,为什么clang在编译时出错?它是一个编译器错误还是它没有在标准中真正定义? – Uflex