Редактировать: Теперь, когда вы предоставили больше информации, возможно, мы сможем пролить свет на это запутанное поведение.
Вы нарушили Правило одного определения .Результаты этого на самом деле не определены, но мы можем сделать некоторые обоснованные предположения на основе ваших наблюдаемых результатов.
Функции шаблона всегда объявляются как встроенные, поскольку это требуется для подстановки параметров шаблона.Когда компилятор сталкивается с одной из этих функций, он может выбрать ее испускание в виде встроенного кода или создание тела функции и ее вызов.Если он создает тело функции, компоновщик становится ответственным за устранение дублирующихся определений в разных единицах перевода.Компоновщик не делает большой проверки, чтобы видеть, являются ли кажущиеся дубликаты функционально эквивалентными, он просто идет по оформленному имени функции, которое зависит от типов аргументов;если все типы имеют одинаковые имена, они предполагаются идентичными.Он может сделать это предположение из-за правила «Одно определение».
Таким образом, вы можете иметь определение класса, которое не включено в ваш источник, повлиять на исход вашего кода - компоновщик заменяет неверную копиюкод для хорошего.Если компилятор генерирует встроенный код, вы получите ожидаемый результат, если компоновщик подключится, у вас будет 50/50 шанс ошибиться.И даже если вашему коду повезло, какой-то другой фрагмент кода теперь поврежден.
Оригинальный ответ: вектор может быть больше запрашиваемого размера, но
size
не будет отражать это значение;Вы можете проверить это, используя
capacity
.Избыточное хранилище будет частью использования памяти, но элементы не будут инициализированы, и любая попытка доступа за пределами результата
size
приведет к неопределенному поведению.