以下は完全に合法的なC++
コードです
void foo (int) {
cout << "Yo!" << endl;
}
int main (int argc, char const *argv[]) {
foo(5);
return 0;
}
名前のないパラメーターを関数内から参照できないという事実を考えると、名前のないパラメーターを関数に残す値があるのではないかと思います。
そもそもなぜこれが合法なのですか?
以下は完全に合法的なC++
コードです
void foo (int) {
cout << "Yo!" << endl;
}
int main (int argc, char const *argv[]) {
foo(5);
return 0;
}
名前のないパラメーターを関数内から参照できないという事実を考えると、名前のないパラメーターを関数に残す値があるのではないかと思います。
そもそもなぜこれが合法なのですか?
はい、これは合法です。これは、対応するパラメーターを使用する予定のない実装で、基本クラスからの仮想の実装に役立ちます。基本クラスの仮想関数のシグネチャと一致するようにパラメーターを宣言する必要がありますが、それを使用する予定はありません。そのため、名前を指定しません。
もう 1 つの一般的なケースは、何らかのライブラリにコールバックを提供する場合で、ライブラリが確立した署名に準拠する必要があります (これを取り上げてくれたAasmund Eldhusetに感謝します)。
また、独自のポスト インクリメント オペレータとポスト デクリメント オペレータを定義する特別なケースもあります。これらのオペレータにはパラメータ付きのシグネチャが必要int
ですが、そのパラメータは常に使用されません。ただし、この規則は、言語設計のハックに接しています。
もちろん、関数を宣言するだけでパラメーターに名前を付けないことは有効ですが、実装でも有効です。この最後の明らかに奇妙なバージョンは、関数が特定の固定シグネチャを持つようにパラメーターを宣言する必要があるが、パラメーターは必要ない場合に役立ちます。
これは、たとえば、派生クラスのメソッド、コールバック関数、またはテンプレートパラメータで発生する可能性があります。
パラメータに名前を付けないことは、パラメータが不要であり、その値が使用されないことを明確にします。一部のコンパイラでは、代わりにパラメータに名前を付けてから単に使用しないと、関数本体に問題がある可能性があるという警告が表示されます。