6

重複の可能性:
非静的メンバー関数のデフォルト引数としての非静的メンバー

間違っている場合は訂正してください。ただし、デフォルトのパラメーターが機能すると私が考える方法は次のとおりです。

コンパイラが関数呼び出しを確認すると、パラメーターをスタックにプッシュし始めます。パラメータがなくなると、必要なすべてのパラメータが満たされるまでデフォルトをスタックにプッシュし始めます (パラメータは実際には右から左にプッシュされるため、これは単純化されているため、デフォルトで開始されますが、考え方は同じです)。

これが本当なら、メンバー変数をデフォルトとして使用できないのはなぜですか? コンパイラはコール サイトでいつものようにそれらをプッシュしているので、問題なく解決できるはずです。

編集回答から私の質問が誤解されているように見えるので、明確にさせてください。私はこれが事実であることを知っており、言語で許可されていることと許可されていないことを知っています。私の質問は、自然に機能するように見えるのに、言語設計者がこれを許可しないことを選択した理由です。

4

4 に答える 4

4

あなたが求めているものの本質は、この単純な例に蒸留することができます

void foo(int a, int b = a);

これはC++では許可されていません。C ++では、デフォルトの引数を他のパラメーターに依存させることはできません。

クラスメンバーはthisポインタを介してアクセスされ、thisポインタは各非静的メンバー関数のもう1つの非表示パラメータであるため、デフォルトの引数としてクラスメンバーを使用することは、上記の特定のケースにすぎません。

だから、問題は本当に理由です

void foo(int a, int b = a);

許可されていません。

これを許可しない明らかな潜在的な理由の1つは、引数の評価の順序に追加の要件を課すことです。ご存知のように、C ++では、関数の引数評価の順序は指定されていません。コンパイラーは引数を任意の順序で評価できます。ただし、上記のデフォルトの引数機能をサポートするには、コンパイラはそれがのa前に評価されることを確認する必要がありbます。これは過度の要件のように感じられ、C++で見慣れている評価順序の一般的な自由を制限します。

これに注意してください

int a;

void foo(int b = a);

C++で許可されています。そして、明らかに、それは前述の評価の問題の順序を示していません。

于 2012-12-03T09:03:05.343 に答える
1

リンクされた質問でNawazの優れた答えを要約すると:への呼び出しはvoid Foo::Bar(int a = this->member)本当に意味しvoid Foo__Bar(Foo* this, int a = this->member)ます。明らかに、2番目の引数は最初の引数の前に評価できません。これは、コンパイラーが任意の順序で引数を評価できるというC++の公理に違反します。

于 2012-12-03T08:54:47.987 に答える
1

私は、これが標準の最も適切な段落であると信じています。特に §9:

8.3.6 デフォルト引数 [dcl.fct.default]

§7 デフォルト引数にローカル変数を使用してはならない

§9 [...] 同様に、クラス メンバー アクセス式の id-expression (5.2.5) またはメンバーへのポインターを形成するために使用されない限り (5.3.1)。

于 2012-12-03T07:12:40.767 に答える