有时实例化具有不完整类型的标准容器以获得递归结构很有用:
struct multi_tree_node { // Does work in most implementations
std::vector< multi_tree_node > child;
};
struct trie_node { // Does not work in most implementations
std::map< char, trie_node > next;
};
因为容器没有类型value_type或成员函数来value_type按值传递或返回任何对象的成员,所以这种方法趋于起作用。标准似乎对不完整的模板参数没有说太多,但是在C ++ 11§17.6.4.8[lib.res.on.functions]中有一点,“其他函数的要求”:
特别是,在以下情况下,效果是不确定的:…如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非该组件特别允许。
即使实例不在块范围内,这也使上述构造非法吗?这是否属于“对用于实例化标准库模板组件的类型的操作”(也是17.6.4.8)?还是在所有特别要求的实例化成功后,禁止库实现产生可能因不完整类型而失败的模板实例化?
编辑:由于只有函数可以调用和实例化其他函数,所以将“对类型的操作…”限制为块范围内的那些似乎会使成员函数的内容比签名和成员类定义的内容严格。毕竟,在类型完成之前,对a 做任何事情当然是没有意义的multi_tree_node。甚至扩展到std::unique_ptr,即使在块范围中使用,它也显式支持不完整的类型参数。
编辑2:为我服务,不用打扰测试trie_node示例-甚至我以前都尝试过。它与@Ise链接的文章中的损坏示例相同。但是,尽管这篇文章似乎认为“什么都行不通”是理所当然的,但对我而言,解决方案似乎很简单- std::map内部tree_node类应该是非成员模板,而不是成员非模板类。
无论如何,那篇文章很好地确立了设计意图,所以我猜我对“功能要求”子标题下的看法只是这样。
肥皂起泡泡
小唯快跑啊
相关分类