Clang 和 GCC 对参数名称显示为未计算的操作数的情况有不一致的解释

Clang and GCC has an inconsistent interpretation to the case where the parameter name appears as an unevaluated operand

#include <iostream>
void fun(int a = sizeof(a)){
    std::cout<< a<<std::endl;
}
int main(){
   fun();
}

考虑这个 case。 Clang 接受它而 GCC 拒绝它。根据 [dcl.fct.default] p9

A default argument is evaluated each time the function is called with no argument for the corresponding parameter. A parameter shall not appear as a potentially-evaluated expression in a default argument.

[basic.def.odr] p2

An expression or conversion is potentially evaluated unless it is an unevaluated operand

sizeof 不是潜在求值表达式,此时可以找到 a。我想知道对于这种情况,哪一个是正确的?

海湾合作委员会是错误的。它假定 a 尚未在默认参数的范围内,尽管通常声明点紧接在初始化程序之前的声明符之后,并且 none 的异常适用于此处。 [basic.scope.pdecl]/1

一个较早的错误报告是 here

但是请注意,错误报告中的代码与您的相同,但声称它应该是 ill-formed。那是因为它是在 CWG 2082 之前编写的,它允许在默认参数的未计算上下文中使用参数。

关于此 GCC 错误的相关问题