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

When must a type used as template argument be complete if it is used internally in a context that requires a complete type?

本文关键字:类型 何时必 参数 上下文 内部 如果      更新时间:2023-10-16

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

我有一个问题困扰了我几个小时。

起初,我认为该类型必须在实例化的点是完整的,但我尝试过的所有编译器都接受该类型在这一点上仍然是不完整的,只要它在翻译单元中的任何地方定义即可。

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

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

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

以前的代码真的正确吗?在标准中,它在哪里支持用作模板参数的类型被视为完整,如果它在同一翻译单元中的任何地方都是完全?或者当必须时,它是完整的?

模板在最后展开后才会编译(此时测试已完成(。