为什么现有的函数参数不能用于计算其他默认参数?

发布于 2025-01-02 22:40:06 字数 483 浏览 2 评论 0原文

我正在编写一个函数 foo(),它接受 2 个 const char* 作为参数,pBeginpEndfoo() 被传递一个以 null 结尾的字符串。默认情况下,pEnd 指向字符串的\0(最后一个字符)。

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

但是,我在上面一行收到错误:

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

为什么编译器不允许这样的操作?潜在的问题是什么?

I was writing a function foo() which takes 2 const char*s as arguments, pBegin and pEnd. foo() is passed a null terminated string. By default pEnd points to \0 (last character) of the string.

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

However, I get an error at above line as:

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

Why compiler doesn't allow such operation ? What's the potential problem ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

白衬杉格子梦 2025-01-09 22:40:06

该标准不仅明确禁止在默认参数表达式中使用其他参数,而且还解释了原因并给出了示例:

ISO/IEC 14882:2003(E) - 8.3.6 默认参数 [dcl.fct.default]

9. 每次调用函数时都会评估默认参数。
函数参数的求值顺序未指定。
因此,默认情况下不应使用函数的参数
参数表达式,即使它们没有被求值。
a 的参数
在默认参数表达式之前声明的函数在范围内
并且可以隐藏命名空间和类成员名称。 [示例:

 int a;
    int f(int a, int b = a); // 错误:参数a
                                     // 用作默认参数
    typedef int I;
    int g(浮点 I, int b = I(2)); // 错误:我找到的参数
    int h(int a, int b = sizeof(a)); // 错误,使用了参数a
                                     // 在默认参数中

—结束示例] ...

The standard not only explicitly disallows the use of other parameters in a default argument expression, but also explains why and gives an example:

ISO/IEC 14882:2003(E) - 8.3.6 Default arguments [dcl.fct.default]

9. Default arguments are evaluated each time the function is called.
The order of evaluation of function arguments is unspecified.
Consequently, parameters of a function shall not be used in default
argument expressions, even if they are not evaluated.
Parameters of a
function declared before a default argument expression are in scope
and can hide namespace and class member names. [Example:

    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

—end example] ...

猥︴琐丶欲为 2025-01-09 22:40:06

该语言仍然提供了一种方法来完成您想要的操作 - 使用重载函数:

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

void foo (const char *pBegin)
{ foo(pBegin, strchr(pBegin, 0)); }

The language still offers a way to do what you want - use overloaded functions:

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

void foo (const char *pBegin)
{ foo(pBegin, strchr(pBegin, 0)); }
情魔剑神 2025-01-09 22:40:06

调用函数时,将对默认参数进行求值,但 C++ 标准未定义它们的求值顺序。这意味着您无法在默认参数中引用其他参数,因为它们可能尚不具有已知值。

When the function is called the default arguments are evaluated, but the order they are evaluated is not defined by the C++ standard. That means that you can't reference other parameters in a default argument because they may not have a known value yet.

北座城市 2025-01-09 22:40:06

您不能在默认参数值中使用局部变量。

引用自此处:

标准告诉我们默认参数只是一个表达式。
有些事情是不允许的(使用局部变量,使用
关键字“this”),但几乎任何其他内容都可以作为默认值
论证。

You can't use a local variable in a default argument value.

Quote from here:

The standard tells us that the default argument is simply an expression.
There are some things that are no allowed (using local variables, using
the keyword 'this') but pretty much anything else can serve as a default
argument.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文