函数参数的默认值为"passing_parametr"*2

St.*_*rio 3 c++ scope function

我写了以下内容:

#include <stdio.h>

int foo(int x, int y=2*x)
{
    return y;
}

int main()
{
    printf("%d\n",foo(5));
}
Run Code Online (Sandbox Code Playgroud)

但我有编译时错误error: local variable ‘x’ may not appear in this context 但是我预计它会没问题,因为3.3.4/1:

在函数声明中,或除函数定义(8.4)的声明符之外的任何函数声明符中,参数名称(如果提供)具有函数原型作用域,该作用域终止于最近的封闭函数声明符的末尾.

结束最近的封闭函数声明符,声明}点紧跟在之后int x.那为什么它不起作用?

jro*_*rok 5

这不是因为范围.8.3.6/7

局部变量不得用于默认参数.

并且8.3.6/9:

每次调用函数时都会计算默认参数.函数参数的评估顺序是未指定的.因此,函数的参数不应在默认参数中使用,即使它们未被评估.在默认参数之前声明的函数的参数在范围内,并且可以隐藏命名空间和类成员名称.

禁止这样做是有道理的,因为函数参数的评估顺序是未指定的.y如果2*x在论证之前评估是什么价值x