Clang и GCC имеют противоречивую интерпретацию в случае, когда имя параметра отображается как невычисленный операнд.
#include <iostream>
void fun(int a = sizeof(a)){
std::cout<< a<<std::endl;
}
int main(){
fun();
}
Рассмотрим этот случай . Clang принимает его, а GCC отклоняет. Согласно [dcl.fct.default] p9
Аргумент по умолчанию оценивается каждый раз, когда функция вызывается без аргумента для соответствующего параметра. Параметр не должен появляться как потенциально вычисляемое выражение в аргументе по умолчанию.
[basic.def.odr] p2
Выражение или преобразование потенциально оцениваются, если только они не являются невычисленным операндом.
sizeof
не является потенциально оцениваемым выражением и
a
можно найти в этот момент. Интересно, какой из них правильный для этого случая?
1 ответ
ГСК ошибается. Предполагается, что
a
еще не входит в область действия в аргументе по умолчанию, хотя обычно точка объявления находится сразу после декларатора перед инициализатором, и здесь не применяется ни одно из исключений. [basic.scope.pdecl]/1
Более старый отчет об ошибке для этого находится здесь .
Однако обратите внимание, что отчет об ошибке имеет код, эквивалентный вашему, но утверждает, что он должен быть неправильно сформирован. Это связано с тем, что он был написан до CWG 2082 , которая позволяла использовать параметр в неопределенном контексте в аргументе по умолчанию.
Связанный вопрос об этой ошибке GCC здесь .