为什么我可以在std :: vector中使用前向声明的类?

时间:2015-03-25 17:19:32

标签: c++

我认为你只能为前向声明的类创建一个引用或指针成员。但是,我很惊讶地发现这有效:

#include <vector>

struct Donkey;

struct Cage
{
    std::vector<Donkey> donkeys;
};

struct Donkey
{
};

int main()
{
    Cage c;
}

http://ideone.com/EP0zKR

如何使用前向声明的类定义std::vector?这是标准吗?

2 个答案:

答案 0 :(得分:5)

实际上,你不能

仅仅因为你的程序编译(这取决于底层实现的事实)并不意味着它是有效的。

There are times other than declaring a T* or a T& at which you may use a forward declaration;只是this is not one of them

答案 1 :(得分:0)

这是未定义的行为。

  

[C ++ 14/§17.6.4.8] 1在某些情况下(替换函数,处理程序   函数,用于实例化标准库的类型的操作   模板组件),C ++标准库依赖于组件   由C ++程序提供。如果这些组件不符合他们的要求   要求,标准对此没有要求   实现。

     

[C ++ 14/§17.6.4.8] 2特别是,效果未定义   以下情况:[...]

     
      
  • 如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许   该组件。
  •   

此外,不完整类型不符合分配器要求:

  

[C ++ 14/§17.6.3.5] 9分配器可以约束它所使用的类型   可以实例化其构造成员的参数   可能被称为。如果某个类型不能与特定分配器一起使用,   分配器类或对构造的调用可能无法实例化。

因为你的类在向量被实例化时有一个定义,所以没关系。请留意此提案,该提案将更改分配器要求N4056 Minimal incomplete type support for standard containers