Tenho uma constante declarada em uma case
das minhas switch
declarações:
void foo( int& v ) {
switch( v ) {
case 0:
static constexpr int c{ 0 };
break;
case 1:
v = c;
break;
}
}
Tudo funciona bem no GCC, Clang e EDG. Mas se eu compilar o programa no Visual Studio, ele reclama
erro C2360: a inicialização de 'c' é ignorada pelo rótulo 'case'
Demonstração online: https://gcc.godbolt.org/z/jTdnhfzoo
É correto que a inicialização da constante c
pode ser pulada? O programa está realmente malformado ou deve ser aceito?
Não, não se for inicializado de forma constante, como na sua função.
Isso significa que sua função é válida e será inicializada
c
quando oswitch
bloco for inserido pela primeira vez. Uma função similarmente válida:Remover
constexpr
não importa aqui. Ainda será uma inicialização constante de uma entidade de escopo de bloco comstatic
duração de armazenamento e, portanto, executada quando o bloco for inserido pela primeira vez.Este bug no MSVC é relatado aqui .
Nota: Só porque é válido, não significa que seja uma boa ideia. Não faça isso.