我非常驚訝的是,在克各種採樣版本++,下面編譯沒有錯誤或警告:不完整的類使用模板
// Adapted from boost::checked_delete()
template <class T> inline void assert_complete()
{
typedef char type_must_be_complete[ sizeof(T) ? 1 : -1 ];
(void) sizeof(type_must_be_complete);
}
class X;
void f()
{
assert_complete<X>();
}
class X {};
int main() {}
如果X
定義丟失或在不同的翻譯單元,我確實會得到錯誤。
但是在上面的程序中,是不是我的模板的單個實例化點的定義是f
?那個實例化的X
不是不完整的語義錯誤?
(C++ 03和/或C++ 11 Draft)標準調用這個程序是否格式良好,格式不正確,格式不正確,診斷不需要,或者是未定義的行爲?
編輯:@David Rodriguez - dribeas報告稱,clang ++,comeau和Visual Studio 2010也接受類似的代碼。只要該類型是在翻譯單元則任何早期完整實例將完成地方完成
class X {};
:
有趣的是,當我爲'X'的定義添加一個'int'時,'sizeof(T)'爲4。過去已知模板具有預知能力。 –