首页 > 解决方案 > 函数默认参数值取决于 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++compiler-errorslanguage-lawyerfunction-declarationdefault-arguments

解决方案


根据 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 的计算操作数:

1 sizeof 运算符产生其操作数的对象表示中的字节数。操作数要么是一个表达式,它是一个未计算的操作数(第 8 条),要么是一个带括号的类型 ID。

和 C++17 6.3.2 声明点:

1 名称的声明点紧跟在它的完整声明符(第 11 条)之后和它的初始化器(如果有的话)之前,除非下面注明。


推荐阅读