43

以下は完全に合法的なC++コードです

void foo (int) {
    cout << "Yo!" << endl;
}

int main (int argc, char const *argv[]) {
    foo(5); 
    return 0;
}

名前のないパラメーターを関数内から参照できないという事実を考えると、名前のないパラメーターを関数に残す値があるのではないかと思います。

そもそもなぜこれが合法なのですか?

4

4 に答える 4

56

はい、これは合法です。これは、対応するパラメーターを使用する予定のない実装で、基本クラスからの仮想の実装に役立ちます。基本クラスの仮想関数のシグネチャと一致するようにパラメーターを宣言する必要がありますが、それを使用する予定はありません。そのため、名前を指定しません。

もう 1 つの一般的なケースは、何らかのライブラリにコールバックを提供する場合で、ライブラリが確立した署名に準拠する必要があります (これを取り上げてくれたAasmund Eldhusetに感謝します)。

また、独自のポスト インクリメント オペレータとポスト デクリメント オペレータを定義する特別なケースもあります。これらのオペレータにはパラメータ付きのシグネチャが必要intですが、そのパラメータは常に使用されません。ただし、この規則は、言語設計のハックに接しています。

于 2012-08-29T21:24:19.663 に答える
14

もちろん、関数を宣言するだけでパラメーターに名前を付けないことは有効ですが、実装でも有効です。この最後の明らかに奇妙なバージョンは、関数が特定の固定シグネチャを持つようにパラメーターを宣言する必要があるが、パラメーターは必要ない場合に役立ちます。

これは、たとえば、派生クラスのメソッド、コールバック関数、またはテンプレートパラメータで発生する可能性があります。

パラメータに名前を付けないことは、パラメータが不要であり、その値が使用されないことを明確にします。一部のコンパイラでは、代わりにパラメータに名前を付けてから単に使用しないと、関数本体に問題がある可能性があるという警告が表示されます。

于 2012-08-29T21:34:14.323 に答える