c++ - 函数默认参数值取决于 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 的计算操作数:
1 sizeof 运算符产生其操作数的对象表示中的字节数。操作数要么是一个表达式,它是一个未计算的操作数(第 8 条),要么是一个带括号的类型 ID。
和 C++17 6.3.2 声明点:
1 名称的声明点紧跟在它的完整声明符(第 11 条)之后和它的初始化器(如果有的话)之前,除非下面注明。
推荐阅读
- php - 用复选框返回的值填充需要存储在 MySQL 数据库中的模型的最佳方法是什么?
- c++ - 以不同的风格在 C++ 中定义函数
- javascript - 将自定义字符串发送到 AWS SNS
- html - 在圆形svg内显示图像
- python - 如何使用 pyparsing 解析带撇号的语言?
- python - Python比较文件名和文件夹名
- c# - 二进制搜索数组以在列表视图中显示一行字符串 c# (Visual Studio)
- javascript - 画布上的像素尺寸不合适
- sdk - 亚马逊设备消息传递 (ADM) 1.1.0 IncompatibleClassChangeError 异常
- java - 如何在创建和更改 UI 的方法的同时运行播放歌曲的方法?