C/C++では、次のコードは完全に正常に動作します。voidでポインタ関数に戻り値のある関数を割り当てることができないのはなぜですか?
void *pa;
void fa(void*);
int a; // or any type
pa = &a;
fa(&a);
これは、関数の戻り値の型には当てはまりませんなぜ私は混乱している:
void fa(void);
int fb(void);
void (*pa)(void);
int (*pb)(void);
pa = fa; pb = fb; // OK
-> pa = fb; // Wrong, why???
pb = fa; // Wrong, but reasonable
fb
の戻り値の型がよく捨てることができるので(つまり、その戻り値を使用せずに、直接fb()
を呼び出します)なぜマークされたラインは機能しないのですか?
これに対して、コンパイラはまだ文句を言っていません。
void* fa(void);
int* fb(void);
void* (*pa)(void);
int* (*pb)(void);
pa = fa; pb = fb; // OK
-> pa = fb; // Wrong, why???
// pb = fa;
[Error] invalid conversion from 'int* (*)(void)' to 'void* (*)(void)' [-fpermissive]
あなたのソースコードが返された値を無視したとしても、私は全く何のアイデアなぜ...
異なるタイプなので間違っています。さらに、C++は、一般的な 'void * 'イディオムの範囲を若干減らします。 Cの時代には、便宜上、多くの状況で 'void *'を使用しなければなりませんでした。 C++は 'void *'の使用を控え、適切なタイプセーフな設計を強調しています。ここで何をしようとしていても、間違っています。 'void * 'を使いこなすことなく、あなたがしていることを100%型安全に実装する方法を理解する必要があります。 –
最初のコードと他のコードとの関係は明確ではありません。 "void"はどこでも同じ意味を意味するわけではありません。 "void *"では "anything"を意味しますが、それ自体では "nothing"を意味します。 – molbdnilo
@molbdniloこのコードは 'int * f(void); void *(* pf)()= f; 'コンパイラは' [int](int) 'から' void *(*)(int) '[-fpermissive] 'への無効な変換を[エラー]にします。 – iBug