继续问我的问题here:
我知道在正向减速之后,例如
class Foo;
我可以将变量声明为Foo*
或Foo&
,但不能Foo
,如果我的模板类Bar<T>
只有T*
, T&
在其内部,同样的规则适用于Bar<Foo>
(即我只需要向前减速才能写Bar<Foo>
)。
我的问题是STL类是否保证这样,它们只包含对模板类型的引用和指针。我测试了这个:
class A;
std::vector<A> b;
使用ST20的VS2010实现并编译,但我不知道这是否适用于所有STL容器,也不知道这是否是STL的MS实现的方式,或者它是否是标准。
答案 0 :(得分:3)
C ++标准要求所有类模板的完整类型(例如std::shared_ptr
和std::unique_ptr
在某些特殊情况下)。容器需要完整的类型,因此您的代码示例将技术上产生未定义的行为,即使它可能适用于某些实现。
请注意boost.container
有std c ++ - 类似于containers for incomplete types。
请参阅此related SO post。
这是在 17.6.4.8 [res.on.functions] 中列出的,它指定了未定义的行为
如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许该组件。
感谢@DietmarKühl找到合适的报价。
答案 1 :(得分:2)
在17.6.4.8 [res.on.functions]第2段中陈述
特别是,在以下情况下效果未定义:
- [...]
- 如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许该组件。
也就是说,标准库容器需要进行显式豁免,允许对具有不完整类型的某些类型进行实例化。我很漂亮,容器部分没有说明这样的例外情况。