【发布时间】:2011-11-04 20:01:06
【问题描述】:
我很惊讶在 g++ 的各种采样版本上,以下编译没有错误或警告:
// 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 草案)标准是否将此程序称为格式正确、格式错误、格式错误但不需要诊断或未定义行为?
编辑:@David Rodriguez - dribeas 报告说 clang++、comeau 和 Visual Studio 2010 也接受类似的代码。
【问题讨论】:
-
有趣的是,当我在
X的定义中添加int时,sizeof(T)是 4。过去已知模板具有预认知能力。
标签: c++ templates incomplete-type