4

次のコードが整形式である理由:

void foo(int i, int j = 56);
void foo(int i = 42, int j);

int main(){  }

デモ

しかし、次の

void foo(int i = 42, int j);
void foo(int i, int j = 56);

int main(){  }

デモ

は不正です。を調べてみたN4296::8.3.6 [dcl.fct.default]ところ、次の例が見つかりました。

class C 
{
    void f(int i = 3);
    void g(int i, int j = 99);
};
void C::f(int i = 3) { } //error
void C::g(int i = 88, int j) { // C::g can be called with no argument
}

しかし、clang はそうではないようです。

struct A
{
    void foo(int i = 42, int j);
};

void A::foo(int i, int j = 56){ }; //error

int main(){  }

デモ

それで、それは実装上の問題ですか?正式には、この例はすべて受け入れられるはずですよね?

4

1 に答える 1

1

[dcl.fct.default]

  1. [...]デフォルトの引数は、同じスコープ内の関数の後の宣言に追加できます。
void foo(int i, int j = 56);
void foo(int i = 42, int j);

2 番目の宣言では、最初のパラメーターに既定の引数が追加されているため、これは問題ありません。

[...]特定の関数宣言では、デフォルト引数を持つパラメーターに続く各パラメーターには、この宣言または前の宣言で提供されたデフォルト引数が必要です[...]

2 番目の宣言の 2 番目のパラメーターには既に既定の引数があります。別の引数を指定しようとするとエラーになります。

void foo(int i = 42, int j); // error
void foo(int i, int j = 56);

最初の宣言は最初のパラメーターのデフォルト引数を指定しますが、2 番目のパラメーターには指定しないため、これはエラーです。最初の例とは異なり、以前の宣言はありません。

struct A
{
    void foo(int i = 42, int j); // the error should be here
};

void A::foo(int i, int j = 56){ }; // not here

これは上記とまったく同じ理由で正しくjありません。最初の宣言にデフォルトの引数がありません。例の次の行は無関係です。

于 2015-01-07T06:34:09.323 に答える