Стандарт C ++ определяет зависимости типа стандартных контейнеров? - PullRequest
3 голосов
/ 20 июня 2019

В " зависимых типах с unordered_map " было отмечено, что std::unordered_map<Key, Value> имеет зависимость типа от Value в libstdc ++ (что является неожиданным) и не имеет зависимости типа от Value в libc ++ и MSVC.

В целом, спецификация ISO C ++ говорит о типовых зависимостях контейнеров вообще? Если да, не могли бы вы указать мне на соответствующие части?

Зависимость типа: Я не уверен, есть ли формальное определение зависимости типа в спецификации ISO C ++, но для целей этого поста, скажем, type A имеет зависимость типа на type B, если A не может быть скомпилирован только с предварительным объявлением B. Пример:

struct Val; // forward declaration of Val
struct Container {
  Val v;
}; // Compile error; Type Val is incomplete. Container has a type dependency on Val
struct Val; // forward declaration of Val
struct Container2 {
  Val *v;
}; // Compiles. Container2 does not have type dependency on Val

1 Ответ

8 голосов
/ 20 июня 2019

Возможно, вы ищете это:

[res.on.functions] / 2 В частности, эффекты не определены в следующих случаях:

...

(2.5) - если при создании экземпляра компонента шаблона в качестве аргумента шаблона используется неполный тип (6.9), если это специально не разрешено для этого компонента.


Из различных стандартных контейнеров в разделе [контейнеры] указывается, что экземпляры std::forward_list, std::list и std::vector могут быть созданы с неполными типами.Например,

[vector.overview] / 3 Неполный тип T может использоваться при создании экземпляра vector, если распределитель удовлетворяет требованиям полноты распределителя (20.5.3.5.1).T должно быть завершено до того, как будет получен какой-либо член результирующей специализации vector.

Существует аналогичная формулировка для forward_list и list.

...