如果在需要完整类型的上下文中内部使用,用作模板参数的类型何时必须完整
When must a type used as template argument be complete if it is used internally in a context that requires a complete type?
可能重复:
模板中的类使用不完整
我有一个问题困扰了我几个小时。
起初,我认为该类型必须在实例化的点是完整的,但我尝试过的所有编译器都接受该类型在这一点上仍然是不完整的,只要它在翻译单元中的任何地方定义即可。
为了说明这一点,问题是关于这个简单程序的正确性:
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中调用一个模板,在该模板中执行相同的操作。
以前的代码真的正确吗?在标准中,它在哪里支持用作模板参数的类型被视为完整,如果它在同一翻译单元中的任何地方都是完全?或者当必须时,它是完整的?
模板在最后展开后才会编译(此时测试已完成(。
相关文章:
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 何时包含内置类型和运算符的标头?
- 何时使用表达式的类型(而不是类别)?
- 在显式实例化期间,不完整的类型何时可以?
- 标准::任何时 GMOCKing 接口的类型不完整
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 我该如何允许类型的对象非专业化并在不使用指针的情况下识别何时是这种情况
- 何时与另一种类型兼容
- 隐式类型转换何时在C++发生?
- 类型、value_type和element_type之间有什么区别,以及何时使用它们?
- 指针到数组何时可以转换为不同类型的指针到数组?
- 何时可以与相应的完整对象类型具有不同的布局
- 引用对象的动态类型何时可以更改
- 检测类型何时不需要调用其析构函数
- 类型何时提升为无符号 int
- c++11 中的类型何时允许内存
- 如果在需要完整类型的上下文中内部使用,用作模板参数的类型何时必须完整
- 递归模板模式;类型何时定型
- 使用递归在List中查找int类型-何时返回
- C++隐式类型何时初始化为0