7

我正在编写一个foo()以 2const char*作为参数的函数,pBegin并且pEnd. foo()传递一个以空字符结尾的字符串。默认情况下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 回答