C++11 では、次の関数宣言:
int f(void);
は次と同じ意味です:
int f();
非依存型 void の単一の名前のないパラメーターで構成されるパラメーター リストは、空のパラメーター リストと同等です。
これは古い機能で、おそらく C から継承されたものではないでしょうか?
パラメータなしで関数を宣言するこの方法の背後にある歴史や理論的根拠を知っている人はいますか?
C++ では、どちらも同じ意味です。
Cf(void)
では とは異なります。これはf()
、f()
「指定されていないパラメーター」を意味するためです。合法的に何でも渡すことができます (データを受信する関数がそれについて満足しているかどうかは別の問題です)。
C++ では、どちらも同じものです。
C ではf()
、この時点で関数が受け取るパラメーターの数がわからないことを意味します。未指定のパラメータです。Andf(void)
は、この関数がパラメータを取らないことを意味します。
C標準から:
6.7.6.3 関数宣言子 (プロトタイプを含む)
6/ パラメータ型リストは、関数のパラメータの型を指定し、その識別子を宣言することができます。
10/
void
リスト内の唯一の項目として型の名前のないパラメーターの特殊なケースは、関数がパラメーターを持たないことを指定します。14/ 識別子リストは、関数のパラメータの識別子のみを宣言します。その関数の定義の一部である関数宣言子の空のリストは、関数にパラメーターがないことを指定します。その関数の定義の一部ではない関数宣言子の空のリストは、パラメーターの数または型に関する情報が提供されないことを指定します。
そして、あなたが言ったように、C++標準で:
8.3.5 関数 [dcl.fct]
4/ parameter-declaration-clauseは、関数が呼び出されたときに指定できる引数とその処理を決定します。[注: *パラメーター宣言節* は、関数呼び出しで指定された引数を変換するために使用されます。5.2.2 を参照してください。--<em>end note ] parameter-declaration-clauseが空の場合、関数は引数を取りません。非依存型の単一の名前のないパラメーターで構成されるパラメーター リスト
void
は、空のパラメーター リストと同等です。
これは C から C++ に来ます。C では、不明な数と型のパラメーターをf()
意味します。したがって、パラメータがない場合の C には があります。f( void )
C++ では冗長です:同じことf()
をf( void )
意味します - パラメータを持たない関数です。
C++ では違いはありません。ただし、これは C から継承されており、int f()
「任意の型の任意の数の引数を取ることができる関数」を意味し、引数int f(void);
を取らない関数を指定します。
編集Angewが指摘したように、Cでは、 f() は「この時点でパラメーターが不明な関数」を意味します。これは、任意の数の引数を取ることができるという意味ではありません。これに近いのf(T arg, ...)
はです。少なくとも 1 つの引数を受け入れる のarg
前に、少なくとも 1 つの名前付きパラメータがあります(@hvd が指す)。...
arg
p11の「C++の歴史」(Bjarne Stroustrupによる1979-1991)から:
C with Classes では、型チェックなしで任意の型の任意の数の引数を取ることができる関数を C で宣言する f() とは対照的に、引数を取らない関数 f の表記法 f(void) が導入されました。
ただし、後で、空の関数宣言子に明らかな意味が与えられ、新しい構造体がすぐに時代遅れになったと述べています。後でそれを削除することを気にする人は誰もいないと思います (または、サポートが必要な C++ コードが既に書かれている可能性があります)。
C:
ただし、この構造は、関数のプロトタイピングが C++ から直接借用された C 言語の標準化の時点で重要な役割を果たしました。この場合f(void)
、既存の C コードをサポートするのに役立ちました (このコードでf()
は、指定されていない数の引数を取る関数を示すという概念が既に予約されていました)。
それ以前は、C 言語は各パラメーターに特定の型をアタッチできませんでしたが、f()
フォームを使用して宣言できるのは、引数の数が指定されておらず、型が指定されていない関数のみでした。