Следующий код создает следующую ошибку компиляции для всех версий GCC, которые я пробовал, в режимах С++ 98, С++ 11 и С++ 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) {}
Конечно, это явно сломанный код, потому что я на самом деле ничего не инициализирую.
Но почему это инициализатор базового класса и почему он "анахроничен", а не просто неправильно? Было ли это когда-то действительно? Когда? И что это значит?
only rel ated ссылки Я нашел к этому в Интернете были люди, которые сталкивались с ошибкой, когда имя участника было случайно выведено макросом, что в итоге привело к тому же самому коде, что и выше:
#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
};
Эти люди никогда не узнали, что такое ошибка, хотя позже они по крайней мере обнаружили, почему их программа была нарушена.