以下代碼在我嘗試使用C++ 98,C++ 11和C++ 14模式的所有版本的GCC上產生後續編譯錯誤:錯誤:不合時宜的舊式基類初始化程序
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 related references我發現這個在網絡上被人穿過的錯誤來當一個成員的名字被意外macro'd出來,有效地產生相同的代碼上面:
#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
};
那些人從來沒有找到錯誤的含義,儘管他們後來至少發現了他們的程序被破壞的原因。
我會_guess_這個語法是在類C中的基類初始化語法,就在最早的[非標準] C++引入多重繼承之前。 – 2015-04-02 21:04:29
這也似乎是對我來說最合理的假設。不幸的是,我一直無法通過常見的渠道找到第一版或第二版的「The C++ Programming Language」。不過,我確定SO上的某個人有一個。 – Brian 2015-04-02 21:09:50
尋找「註釋參考手冊」(ARM)也許? – 2015-04-02 21:10:50