函数作用域内的函数声明是否可以将本地定义的常量作为默认参数?
例如,
void f(int) {}
int main() {
constexpr int c = 1;
void f(int = c);
f();
}
GCC 不喜欢它,并说
错误:局部变量‘c’不得出现在此上下文中
MSVC 的行为类似:
错误 C2587:‘c’:非法使用局部变量作为默认参数
但 Clang 可以很好地接受它。在线演示:https://gcc.godbolt.org/z/9vWoK6TEz
这里哪种实现是正确的?
Clang 是正确的,没有什么可以阻止将其用作
c
默认参数。根据诊断,GCC 和 MSVC 似乎正在尝试实现以下注意事项:但是,由于
c
是constexpr
变量,因此读取它并不构成 ODR 使用。由于c
此处不是 ODR 使用,因此该注释不适用。请注意,如果你尝试
c
在默认参数中进行 ODR 使用,比如通过引用它或者通过使
c
notconstexpr
,Clang 拒绝它。