Происходит следующее: компилятору приходится выбирать между одной из перегрузок конструктора vector
, которая допускает более одного аргумента:
explicit vector(size_type n, const T& value = T(),
const Allocator& = Allocator());
template <class InputIterator>
vector(InputIterator first, InputIterator last,
const Allocator& = Allocator());
Первая перегрузка (которую вы хотите сопоставить) требует преобразования аргументов. Второй не требует преобразования, так как 2 аргумента имеют одинаковый тип. Это перегрузка, которую выбирает компилятор. К сожалению, тип int
не имеет всех операций, которые второй конструктор использует для этих аргументов.
Если аргументы будут разных типов, приведите NULL
к int*
или оставив первый аргумент без знака (1U
), как правильно предлагают другие ответы, позволит избежать проблемы, заставив компилятор выбрать первый параметр конструктора. .
Обновление:
Когда я компилирую это с MinGW 4.5.2, я получаю ошибки компиляции (разные, но, по-моему, по той же причине). Однако, когда я строю с MSVC (2008 или 2010), я не получаю ошибок. Когда я смотрю на код, который генерирует MSVC, он фактически соответствует второй перегрузке (с 2 итераторами), а не перегрузке «размер и значение по умолчанию».
«Ага», я думаю, «это может произойти сбой во время выполнения где-то, потому что итераторы со значениями 1
и 0
не имеют никакого смысла».
Однако, когда типы итераторов этого конструктора оказываются равными int
, реализация MSVC выполняет конструкцию 'count / начальное значение' vector
.
Стандарт говорит, что должен делать этот конструктор, когда аргументы InputIterator
конструктора удовлетворяют требованиям InputIterator. Поскольку int
не соответствует требованиям InputIterator, реализация имеет некоторое свободное право делать что-то еще. Стандарт гласит: «Реализация может объявлять дополнительные не виртуальные сигнатуры функций-членов в классе» (17.4.4.4), и это, я думаю, будет охватывать поведение MSVC. Поведение, которое вы видите и которое я вижу в GCC 4.5.2, производящем диагностику ошибок, также разрешено стандартом.
Я уверен, что поведение MSVC - это то, что большинство пользователей хотят и хотят (пока они не перейдут к коду в какой-то другой компилятор, может быть). И это, конечно, умно.