Здравствуйте, Trinity-2001, Вы писали:
T2>Привет всем! T2>Вопрос такой — если создавать вектор так:
T2>
T2>vector<int> v(5, 8);
T2>
T2>то создастся вектор из пяти элементов, и все они равны 8.
T2>А если создавать так:
T2>
T2>vector<int> v(5);
T2>
T2>то там будет 5 элементов, но чему они будут равны?
T2>VS 2008 выводит, что все равные 0, но всегда ли так?
T2>Сорри, вопрос, наверное, глупый, но вот читаю книгу, и там не написано точно.
да, всегда.
во втором случае для каждого элемента вызовется конструктор по-умолчанию, для int он инициализирует элемент нулем.
Здравствуйте, Roman Odaisky, Вы писали:
RO>А если уж совсем согласно, то std::vector<int> v(5, 8) вызовет вовсе не выделенный конструктор и не скомпилируется (баг стандарта).
поясните почему код не должен скомпилироваться и в чем баг стандарта
На деле же, большинство реализаций достаточно умные, чтобы проверить, что им подсунули в качестве итераторов и, если это не итератор — вызвать нужную функцию для инициализации. Но вот, насколько помню, в VS 6 выдавало ошибку компиляции.
Of course, the code must be complete enough to compile and link.
L_L>На деле же, большинство реализаций достаточно умные, чтобы проверить, что им подсунули в качестве итераторов и, если это не итератор — вызвать нужную функцию для инициализации. Но вот, насколько помню, в VS 6 выдавало ошибку компиляции.
А можно объяснить, почему должен вызваться этот конструктор вместо этого:
explicit vector(size_type n, const T& value = T(),
const Allocator& = Allocator());
Здравствуйте, Lorenzo_LAMAS, Вы писали:
XMK>>во втором случае для каждого элемента вызовется конструктор по-умолчанию, для int он инициализирует элемент нулем.
L_L>У встроенного типа int нет конструкторов по умолчанию (и вообще нет конструкторов). не надо человека запутывать.
А как тогда называется запись int(), которое в VS вроде работает?
Здравствуйте, XJess, Вы писали:
XJ>А как тогда называется запись int(), которое в VS вроде работает?
это просто инициализация
можете еще деструктор поискать здесь: http://codepad.org/EZZYb8bD
XJ>А как тогда называется запись int(), которое в VS вроде работает?
Эээ, это смотря где она. Одно дело такое void fun(int()); и другое дело такое int() + 2;
Во втором случае это explicit type conversion (functional notation):
5.2.3/2
The expression T(), where T is a simple-type-specifier (7.1.5.2) for a non-array complete object type or the (possibly cv-qualified) void type, creates an rvalue of the specified type, which is value-initialized ....
Соб-сно, ваш вопрос вообще не очень удачен, для случая MyClass().member_fun() (MyClass — определенный пользователем тип) MyClass() это тоже не вызов конструктора (хоть он и будет вызван).
Of course, the code must be complete enough to compile and link.
Здравствуйте, XJess, Вы писали:
XJ>А можно объяснить, почему должен вызваться этот конструктор вместо этого: XJ>Ведь второй лучше подходит?
Согласно 13.3.3/1 функция, не требующая неявных преобразований (в данном случае из int в size_t) предпочтительнее, даже если шаблонная. Компилятор-то не знает, что под InputIterator понимается не любой тип (ему можно было бы это втолковать с помощью концепций, но эту интересную фичу в новый C++ так и не включили).