Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Разница между инициализацией

#cpp


Есть ли разница между 

vector v (istream_iterator(cin),istream_iterator());


и

vector v;
copy (istream_iterator(cin),istream_iterator(),back_inserter(v));


?
    


Ответы

Ответ 1



Первый вариант предпочтительнее, т.к. он более лаконичен и позволяет объявить объект константным. Однако, чтобы он работал ожидаемым образом, следует заменить круглые скобки на фигурные: vector v {istream_iterator(cin),istream_iterator()}; Иначе, исходная конструкция будет интерпретирована компилятором как объявление функции v, принимающей 2 аргумента (один типа istream_iterator с именем cin, второй - безымянный указатель на функцию без аргументов, возвращающую istream_iterator) и возвращающей vector. Более подробно о том, почему так происходит можно почитать например в вики на странице most vexing parse. С учетом исправления синтаксиса, разницы в конечном результате нет. Но зачем делать сложнее, когда можно проще?

Ответ 2



В принципе, разница не велика, результат один и тот же. Просто в первом случае вызывается конструктор копирования, а во втором случае сначала вызывается стандартный конструктор, затем уже происходит копирование.

Комментариев нет:

Отправить комментарий