簡體   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