我正在试验并写下这个怪物:
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。
答案 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 中。