次のコードはC++で有効ですか?関数の名前のないパラメータはデフォルト値を持つことができますか?
void f(void* = 0)
{}
int main()
{
f();
}
どのようなC++標準のページにこの使用法が合法であると書かれていますか?
次のコードはC++で有効ですか?関数の名前のないパラメータはデフォルト値を持つことができますか?
void f(void* = 0)
{}
int main()
{
f();
}
どのようなC++標準のページにこの使用法が合法であると書かれていますか?
はい、合法です。
この組み合わせの機能を具体的に実現するための標準的な用語はありません。単ににはのいずれも許可されていません。
デフォルト引数の構文がパラメータ宣言でパラメータを機能するように適用されます。
[C++11: 8.3.6/1]:
初期化子節がパラメータ宣言で指定されている場合、この初期化子節です既定の引数として使用されます。デフォルト引数は、後続の引数がないコールで使用されます。
...とパラメータ宣言関数パラメータは名前であってもよい。
[C++11: 8.3.5/11]:
[..]識別子は随意パラメータ名として提供することができます。 [..]
(例は規定テキストないので、これは具体的に何を証明するために使用することはできないが)この使用のも一例は、8.3.6/4の下にあります。
はい、完全に合法です。
[例:
void point(int = 3, int = 4);
はゼロ、1つ、または2つの引数を指定して呼び出すことができる関数を宣言する宣言明白な例は、N3485に8.3.6デフォルト引数/4に見出されますint型です。
はい、合法です。
8.3.5/1節の関数パラメータに対して与えられた構文生成では、識別子なしで代入式を持つ(初期化子として)パラメータ宣言が可能です。
これは合法であるだけでなく、実際にはコーディングスタイルによってはかなり役に立ちます。
デフォルトパラメータは、関数宣言でのみ意味があります。
名前付きパラメータは、関数定義でのみ意味があります。
f。H:
void f(void*=nullptr);
f.ccそれはしかし、私は不自然どのような状況に把握することはできません
void f(void* x)
{
...
}
_ "名前付きパラメータは関数定義でのみ意味があります" _ lolwut私はあなたがここで言おうとしていることを理解していますが、それはやや馬鹿げています。 –
、このような機能は、実際に任意の使用を持っている可能性が... –
@MatteoItalia 'enable_if'一般的に。 – Pubby
@MatteoItalia:SFINAE –