令我惊讶的是,这段代码编译如下:
const char* c_str()
{
static const char nullchar = '\0';
return nullchar;
}
它在我的代码中引入了一个bug。谢天谢地,我抓住了它。
这是C++故意的,还是编译器的bug?是否存在主动忽略该数据类型的原因?
它可以在Visual C++ 2010和GCC中工作,但我不明白为什么它应该工作,考虑到明显的数据类型不匹配。( static
也不是必需的。)
发布于 2012-08-19 15:09:41
它并没有忽略数据类型。这不是个bug。它利用了放入其中的const,并且看到它的值实际上是一个整数0 (char是一个整数类型)。
整数0是一个有效的(根据定义)空指针常量,它可以转换为指针类型(变成空指针)。
你想要空指针的原因是有一些“不指向任何地方”的指针值,并且可以是可检查的(例如,你可以将一个空指针与一个整数0进行比较,然后你会得到true )。
如果你删除了const,你会得到一个错误。如果你把double放入其中(就像许多其他非整数类型一样;我猜例外的只是那些可以通过重载转换运算符来转换为常量char*的类型),你会得到一个错误(即使没有常量)。以此类推。
在这种情况下,整个情况是,您的实现看到您返回的是一个空的ptr常量;您可以将其转换为指针类型。
发布于 2012-08-19 14:38:30
有一个自动转换。如果你能很好的运行这个程序:
#include <stdio.h>
const char* c_str()
{
static const char nullchar = '\0';
return nullchar;
}
int main()
{
printf("%d" , sizeof(c_str()));
return 0;
}
在我的电脑上,输出应该是4,->,指针的大小。
编译器自动强制转换。注意,至少gcc给了一个警告(我不知道VS)
发布于 2012-08-19 14:40:34
我认为这可能是空字符在类型之间很常见的事实。您要做的是在返回空字符时设置一个空指针。如果使用了任何其他字符,这将失败,因为您不是将字符的地址传递给指针,而是将字符的值传递给指针。Null是有效的指针和字符值,因此可以将null字符设置为指针。
简而言之,null可以被任何类型用来设置空值,而不管它是数组、指针还是变量。
https://stackoverflow.com/questions/12024706
复制相似问题