erro: inicializador de classe base anacrônico à moda antiga
O código a seguir produz o erro de compilação subsequente em todas as versões do GCC que tentei nos modos C ++ 98, C ++ 11 e C ++ 14:
struct T
{
T(void* x) : (x) {}
};
// main.cpp: In constructor 'T::T(void*)':
// main.cpp:3:18: error: anachronistic old-style base class initializer [-fpermissive]
// T(void* x) : (x) {}
// ^
// main.cpp:3:16: error: unnamed initializer for 'T', which has no base classes
// T(void* x) : (x) {}
Claro, é um código claramente quebrado, porque na verdade não estou inicializando nada.
Mas por que é um inicializador de classe base e por que é "anacrônico", em vez de simplesmente errado? Foi uma vez válido? Quando? E o que isso significava?
oapenas relreferências atadas Descobri que, na web, houve pessoas que encontraram o erro quando um nome de membro foi acidentalmente apagado, resultando efetivamente no mesmo código acima:
#define bar
// ^ some library could have done this
struct T
{
T(int x)
: bar(x) // effectively just `: (x)`
{}
int bar; // will cause its own error
};
Essas pessoas nunca descobriram o que significava o erro, embora mais tarde descobrissem por que seu programa foi interrompido.