如果在需要完整类型的上下文中内部使用,则必须将用作模板参数的类型完整吗?

Dav*_*eas 8 c++ templates

可能重复:
模板中的类使用不完整

我有一个困扰我几个小时的问题.

最初我认为类型必须在实例化时完成,但我尝试的所有编译器都接受该类型在那时仍然是不完整的,只要它在翻译单元中的任何地方定义.

为了说明它,问题是关于这个简单程序的正确性:

template <typename T>
int size() {
   return sizeof(T);   // T is required to be complete in this expression
}
class test;            // test is declared, but incomplete

int main() {
   size<test>();
}
// [1] point of instantiation of size<test>()

class test {};         // Definition of test, now it is complete
Run Code Online (Sandbox Code Playgroud)

根据§14.6.4.1/ 1,实例化的点size<test>是标记为[1]的行,此时类型test仍然不完整.如果我们试图在sizeof(test)那里执行操作,编译器将无法告诉我们类型是不完整的.然而,调用一个模板,其中执行相同精确操作的类型在g ++,clang ++,comeau和Visual Studio 2010中编译.

以前的代码是否真的正确?如果在同一个翻译单元的任何地方完成,那么在标准中它支持用作模板参数的类型是否完整?或者什么时候必须完成?

小智 1

模板直到最后展开后才被编译(此时测试已完成)。