Почему STL-Datastructures нужны полностью определенные типы - PullRequest
6 голосов
/ 12 декабря 2011

При поиске решения этого вопроса я обнаружил эту ветку на другом форуме , в которой говорится, что стандарт требует полного определения всех параметров шаблона для STL-Datastructure. , Это означает, что создание структуры, которая хранит элементы своего собственного типа внутри себя, вызывает неопределенное поведение. Однако, насколько я могу судить, это не учитывается для большинства структур данных до C ++ 11 (то есть std::vector, std::map и т. Д.).

В чем на самом деле может быть проблема использования неполных типов в STL-Datastructures? Или, точнее, какую потенциальную опасность может вызвать следующий код:

#include <stdint.h>
#include <map>

struct Test {
  std::map<uint32_t, Test> m_map1;
};

int main() {
  return 1;
}

Или это одна из тех проблем, когда этот код может не компилироваться с некоторыми реализациями STL, но если он компилируется, вы можете быть уверены, что он работает?

Ответы [ 2 ]

5 голосов
/ 12 декабря 2011

Короткий ответ: потому что так говорится в стандарте. В более общем смысле, в зависимости от реализации и того, что делает каждый тип и функция, создание шаблона может потребовать полного определения. Авторы стандарта либо не хотел, либо не успел проанализировать и укажите подробно, в каких случаях они не хотели требовать полного определения, и остановился на общем заявлении. Обратите внимание, что когда стандарт был написан, было относительно мало опыта с STL, и можно быть уверенным, что не было какой-то умной оптимизации который потребовал бы экземпляр типа аргумента в классе; вместо того, чтобы рискнуть запретить такую ​​оптимизацию, это казалось более безопасным требуется полный тип.

1 голос
/ 12 декабря 2011

По крайней мере, одна проблема, с которой ваш компилятор сталкивается с неполными типами, заключается в том, что он может быть не в состоянии полностью определить размер вашего struct Test .И, таким образом, как некоторый контейнер может создать экземпляр Test ?

На самом деле, как сказал Джеймс, это зависит от того, как шаблон std :: map использует параметр второго типа.Пока он не использует экземпляры, но Test указатели, он должен компилироваться.Но кто может требовать этого для всех реализаций STL (или вообще контейнеров)?Поскольку STL является частью вашего набора компиляторов, потенциальная опасность уменьшает переносимость вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...