void ポインターに関する C と C++ の違いを理解しようとしています。以下は C でコンパイルされますが、C++ ではコンパイルされません (すべてのコンパイルは gcc/g++ -ansi -pedantic -Wall で行われます)。
int* p = malloc(sizeof(int));
malloc
を返すためvoid*
、C++ では代入が許可されていませんが、int*
C では許可されています。
ただし、ここでは:
void foo(void* vptr)
{
}
int main()
{
int* p = (int*) malloc(sizeof(int));
foo(p);
return 0;
}
C++ と C の両方で問題なくコンパイルできます。なんで?
K&R2 言う:
オブジェクトへのポインタは
void *
、情報を失うことなく型に変換できます。結果が元のポインター型に変換されると、元のポインターが復元されます。
そして、これvoid*
は C での変換に関するすべてを要約したものです。C++ 標準は何を規定していますか?