这个带有元组的递归引用是否安全?

时间:2015-01-31 01:21:57

标签: c++ c++11 visual-studio-2013

我正在试验并写下这个怪物:

class my_tuple : public std::tuple < std::vector<my_tuple> > {};

它似乎可以编译并实际工作。而且我觉得它很狡猾,因为下面没有编译:

using my_other_tuple = std::tuple < std::vector<my_other_tuple> > ;

最终,我试图解决为什么my_tuple有效以及是否存在潜在的可怕后果。我试图了解元组是什么以及我能用什么/应该用它们做什么。因此,如果有人愿意对此发表评论,请提供一些非常好的见解,我将不胜感激。

Windows 7和VS 2013。

1 个答案:

答案 0 :(得分:5)

class my_tuple : public std::tuple < std::vector<my_tuple> > {};

这是当前未定义的行为,因为它实例化了一个标准库容器std::vector,其类型不完整,my_tuple,在其定义的结束}之前不会完成。但是,有proposal允许实例化某些标准容器,包括std::vector,类型不完整。 Boost.Containers supports incomplete types as well.

using my_other_tuple = std::tuple < std::vector<my_other_tuple> > ;

这是不正确的。 [dcl.typedef] / p2,强调我的:

  

typedef-name 也可以由 alias-declaration 引入。该   using关键字后面的标识符变为 typedef-name 标识符<后面的可选 attribute-specifier-seq / EM>   属于 typedef-name 。它具有与它相同的语义   由typedef说明符引入。特别是,它没有   定义一个新类型,它不会出现在 type-id 中。