函数的默认参数值取决于C++中的参数名称

如果在C++中定义了一个新变量,则可以在初始化表达式中使用该变量的名称,例如:

int x = sizeof(x);

函数参数的缺省值怎么办?是否允许在那里按名称引用参数?例如:

void f(int y = sizeof(y)) {}

此函数在Clang中被接受,但在GCC中被拒绝,错误为:

'y' was not declared in this scope

演示:https://gcc.godbolt.org/z/YsvYnhjTb

哪个编译器在这里?


解决方案

根据C++17标准(11.3.6默认参数)

9每次调用函数时都会计算默认参数 没有相应参数的实参。参数应为 不会在默认情况下显示为可能求值的表达式 参数。在默认之前声明的函数的参数。 参数在作用域中,可以隐藏命名空间和类成员名称

提供以下示例:

int h(int a, int b = sizeof(a)); // OK, unevaluated operand

因此,此函数声明

void f(int y = sizeof(y)) {}

是正确的,因为在此表达式中sizeof(y)y不是求值操作数,根据C++17 8.3.3 Sizeof:

1sizeof运算符得出对象中的字节数 其操作数的表示形式。操作数可以是一个表达式, 它是未计算的操作数(第8条)或带括号的 Type-id。

和C++17 6.3.2声明点:

1名称的声明点紧跟在其 完成声明(第11条),并在其初始值设定项(如有)之前, 但以下说明除外。

相关文章