7

私は引数としてfoo()2 を受け取る関数を書いていました。null で終了する文字列が渡されます。デフォルトでは、文字列の (最後の文字) を指します。const char*pBeginpEndfoo()pEnd\0

void foo (const char *pBegin,
          const char *pEnd = strchr(pBegin, 0))  // <--- Error
{
  ...
}

ただし、上記の行で次のようなエラーが発生します。

error: local variable ‘pBegin’ may not appear in this context

なぜコンパイラはそのような操作を許可しないのですか? 潜在的な問題は何ですか?

4

4 に答える 4

10

この規格は、デフォルトの引数式で他のパラメーターを使用することを明示的に禁止しているだけでなく、その理由を説明し、例を示しています。

ISO / IEC 14882:2003(E)-8.3.6デフォルト引数[dcl.fct.default]

9.デフォルトの引数は、関数が呼び出されるたびに評価されます。 関数の引数の評価の順序は指定されていません。したがって、関数のパラメーターは、評価されない場合でも、デフォルトの引数式で使用されないものとします。デフォルトの引数式の前に宣言された関数のパラメーターはスコープ内にあり、名前空間とクラスメンバー名を非表示にすることができます。[例:

    int a;
    int f(int a, int b = a);         // error: parameter a
                                     // used as default argument
    typedef int I;
    int g(float I, int b = I(2));    // error: parameter I found
    int h(int a, int b = sizeof(a)); // error, parameter a used
                                     // in default argument

—例を終了] ..。

于 2012-02-05T03:57:12.597 に答える
6

言語は、オーバーロードされた関数を使用して、やりたいことを行う方法を提供します。

void foo (const char *pBegin, const char *pEnd)
{
   //...
}

void foo (const char *pBegin)
{ foo(pBegin, strchr(pBegin, 0)); }
于 2012-02-05T08:58:50.553 に答える
3

関数が呼び出されると、デフォルトの引数が評価されますが、評価される順序はC++標準で定義されていません。つまり、他のパラメーターはまだ既知の値を持っていない可能性があるため、デフォルトの引数で他のパラメーターを参照することはできません。

于 2012-02-05T03:52:46.577 に答える
1

デフォルトの引数値でローカル変数を使用することはできません。

ここからの引用:

標準では、デフォルトの引数は単なる式であるとされています。許可されていないものがいくつかありますが(ローカル変数を使用し、キーワード'this'を使用)、他のほとんどすべてがデフォルトの引数として機能します。

于 2012-02-05T03:53:03.973 に答える