繁体   English   中英

为什么 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM