C ++標準ライブラリのパラメータ型

私はいくつかの標準的なライブラリ関数が、引数としてvoid *を使用していることに気付きました。たとえば、 memcpy 関数のプロトタイプは:

void * memcpy ( void * destination, const void * source, size_t num );

また、 ifstream クラスの read 関数など、char *をパラメータとして使用する関数もあります。そのプロトタイプは次のとおりです。

istream& read ( char* s, streamsize n );

なぜ標準ライブラリはこれらのパラメータを統一しないのですか?例えば、すべてchar *を使用するか、すべてvoid *を使用します。特別な理由はありますか?

1
追加された 編集された
ビュー: 1
古いC関数は、通常、メモリ位置にvoidポインターを使用していました。これは素晴らしいことですが、C ++の割り当て関数もそうですが、voidポインタはポインタ演算には向いていません。 char は "byte"(つまり "最小データユニット")を意味するので、 char * は本当に完全に満足できる代替タイプです。しかたがない。
追加された 著者 Kerrek SB,
memcpy はSTL関数ではありません。
追加された 著者 Oliver Charlesworth,
どちらも istream ではありません。
追加された 著者 Pubby,
@Pubby Ok。それがC ++標準関数のパーティーだとしましょう。
追加された 著者 cheng,

1 答え

ポインタは char * ではなく void * に暗黙的にキャストできます。これは型の安全につながります。型を気にするならば void * を使わないでください。

Since memcpy is designed to work on pointer types it uses void*. read was not designed to work on all pointer types and so it uses char*

void foo(void* x) {}
void bar(char* x) {}

int main() {
  int* x;
  foo(x);
  bar(x);//error - can't convert int* to char*
}
2
追加された