次のコードはC++で合法ですか?
void f(void* = 0)
{}
int main()
{
f();
}
C ++標準のどのページで、この使用法が合法であると述べていますか?
次のコードはC++で合法ですか?
void f(void* = 0)
{}
int main()
{
f();
}
C ++標準のどのページで、この使用法が合法であると述べていますか?
はい、それは完全に合法です。明らかな例は、N34858.3.6デフォルト引数/4にあります。
【例:宣言
void point(int = 3, int = 4);
int型の0、1、または2つの引数で呼び出すことができる関数を宣言します。
はい、それは合法です。
この機能の組み合わせを具体的に許可する標準的な表現はありません。それを禁止するものもありません。
デフォルトの引数構文は、パラメーター宣言の関数パラメーターに適用されます。
[C++11: 8.3.6/1]:
パラメータ宣言でinitializer-clauseが指定されている場合、このinitializer-clauseがデフォルトの引数として使用されます。デフォルトの引数は、末尾の引数が欠落している呼び出しで使用されます。
...およびパラメータ宣言の関数パラメータには名前がない場合があります。
[C++11: 8.3.5/11]:
[..]識別子はオプションでパラメータ名として指定できます。[..]
8.3.6 / 4の下でこの使用法の例さえあります(例は規範的なテキストではないので、これを使用して具体的に何かを証明することはできません)。
はい、合法です。
8.3.5 / 1節の関数パラメーターに指定された構文生成では、識別子なしで、(初期化子としての)代入式を使用したパラメーター宣言が可能です。
それは合法であるだけでなく、コーディングスタイルによっては実際に非常に役立つ可能性があります。
デフォルトのパラメータは、関数宣言でのみ意味があります。
名前付きパラメーターは、関数定義でのみ意味があります。
fh:
void f(void*=nullptr);
f.cc
void f(void* x)
{
...
}