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 здесь .

Другие вопросы по тегам