![](/img/trans.png)
[英]Why does std::equality_comparable not work for std::vector
[英]Why does std::vector work with incomplete types in class definitions?
出现了以下问题:
C++ 标准似乎说, std::vector
需要一个完整的类型才能工作。 (参见https://en.cppreference.com/w/cpp/container/vector ) 那么,为什么下面的代码仍然可以编译?
#include <vector>
struct parent;
struct child
{
std::vector<parent> parents; //parent is incomplete here!
};
struct parent
{
std::vector<child> children;
};
这似乎违反直觉。 如果std::vector
需要完整类型,则std::vector<parent>
不应编译,因为在child
的类定义中只有它的前向声明是已知的。
std::vector
不需要完整的类型?编辑
c++11 和 c++17 之间似乎有区别。 我想了解c++11版本。
标准说(草案 N3690;这是 C++11 之后,C++14 之前):
[res.on.functions]
1 在某些情况下(替换函数、处理函数、对用于实例化标准库模板组件的类型的操作),C++ 标准库依赖于由 C++ 程序提供的组件。 如果这些组件不满足它们的要求,则该标准对实现不作任何要求。
2 特别是,在以下情况下的影响是不确定的:
— 如果在实例化模板组件时将不完整类型 (3.9) 用作模板参数,除非该组件特别允许。
鉴于标准没有要求,并且效果未定义(据我所知,这与未定义的行为相同),没有期望实例化“不工作”比期望它(出现去工作”。
由于C ++ 17中,要求被放松和std::vector
不需要值类型是完整的,如果与适当的分配器(默认分配器是合适的)中使用。 (这种自由不会扩展到使用所有成员函数;它们有额外的要求)。
标准报价(当前草案):
[vector.overview]
如果分配器满足分配器完整性要求,则在实例化向量时可以使用不完整类型 T。 在引用向量的结果特化的任何成员之前,T 应该是完整的。
[分配器.要求.完整性]
如果 X 是类型 T 的分配器类,则 X 还满足分配器完整性要求,如果 T 是否为完整类型:
- X 是完整类型,并且
- allocator_traits 的除 value_type 之外的所有成员类型都是完整类型。
[默认.分配器]
默认分配器的所有特化都满足分配器完整性要求([allocator.requirements.completeness])。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.