A declaração de função em um escopo de função pode ter uma constante definida localmente como argumento padrão?
Por exemplo,
void f(int) {}
int main() {
constexpr int c = 1;
void f(int = c);
f();
}
O GCC não gosta disso, dizendo
erro: a variável local 'c' pode não aparecer neste contexto
O MSVC se comporta de forma semelhante:
erro C2587: 'c': uso ilegal de variável local como parâmetro padrão
Mas Clang aceita muito bem. Demonstração online: https://gcc.godbolt.org/z/9vWoK6TEz
Qual implementação está correta aqui?
Clang está correto, não há nada impedindo o uso de
c
como argumento padrão. Com base nos diagnósticos, GCC e MSVC parecem estar tentando implementar a seguinte nota :No entanto, como
c
é umaconstexpr
variável, ler a partir dela não constitui um odr-use. Comoc
não está sendo odr-usado aqui, a nota não se aplica.Observe que se você tentar usar odr-use
c
em um argumento padrão, digamos, fazendo uma referência a eleou ao
c
não fazer issoconstexpr
, Clang o rejeita.