为什么c ++禁止隐式转换void *?

Why does c++ forbid implicit conversion of void*?

本问题已经有最佳答案,请猛点这里访问。

在C语言中,我们可以将void*转换为任何其他指针。

但是C++禁止它。

1
int *a = malloc(4);

导致此错误:

1
invalid conversion from ‘void*’ to ‘int*[-fpermissive]

C++中有什么潜在的危险吗?

有C++的例子吗?


在C++中,与C不同,必须抛出Maloc的结果。您的代码可以通过一个简单的强制转换调整为工作顺序。

1
int *a = (int *)malloc(sizeof(int));

这里有一篇关于强制演员阵容及其背后原因的伟大文章。这里还有一个供参考的链接。

编辑:根据评论中的建议,使用malloc()不应该是司空见惯的。最接近的选择是使用new进行分配。

1
int *a = new int[15];

附加编辑:如在注释中再次建议的,如果您必须使用EDCOX1×0 },则至少使用C++ CAST。

1
int *a = static_cast<int*>malloc(sizeof(int)); // shout out to @edheal, @mgetz


您可以在C++中进行转换,但它需要一个强制转换。C++旨在成为比C更为类型安全的语言,因此它试图关闭C允许的一些"类型系统中的漏洞"。

在C中,不需要任何诊断即可接受:

1
2
3
4
int x;
void *p = &x;
double *q = p;
*q = 0.0;

在源代码中不存在任何强制转换的情况下,违反了类型安全性。

这是C++的发明人B. Stroustrup回答的C++ FAQ。

C++并没有禁止转换;它只是想让它在源代码中被某种类型的模糊语言记录下来,也就是说,如果不证明,它至少是故意的。

关于void *的起源,stroustrup写了这个(bolding mine):

Late in its history, C with Classes* began to support the notion of a pointer to ‘‘raw memory, void *. The origin of void * is shrouded in some mystery. I vaguely remember inventing it together with Larry
Rosler and Steve Johnson. However, Dave Prosser remembers first having suggested it based on something
used"somewhere in Australia." Possibly both versions are correct because Dave worked closely with
Larry at the time. In either case, void * was introduced into both languages more or less at the same time.
The earliest mention of void * that I can find is in a memo dated January 1, 1983, about the memory management mechanisms provided by my C++ compiler, Cfront, so the origins of void * in C++ must go back at
least to mid-1982. The earliest written record of void * in the context of ANSI C is a proposal by Mike Meissner dated"12 Oct 83," which presented void *essentially as it was accepted into ANSI C in June 1984 [Prosser,2001]

因此C++继承了Stroustrup最初设想的EDOCX1 3概念,而与此同时,C人们在类型安全方面有一个稍微不同的想法。

对于malloc,当然存在危险;但这些危险已经通过已知标识符malloc的存在来标记;演员表没有带来更多的内容,但没有特别要求malloc,而在其他地方要求它将是规则中一个尴尬的例外。

*"C类"是C++的前身