?

Log in

No account? Create an account

Программистское - Общество дровосеков Бердичева по изучению Мишны

Jun. 7th, 2011

12:54 pm - Программистское

Previous Entry Share Next Entry



Кто может объяснить, зачем push_back типа void, а не типа ссылки на контейнер? Зачем заставлять меня делать нелепые телодвижения ради возможности писать container.push_back(x).push_back(y).... ? Почему сразу нельзя было?

Comments:

[User Picture]
From:dvv
Date:June 7th, 2011 08:12 pm (UTC)
(Link)
Шоб неповадно было.
Заведи свой темплит.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:June 7th, 2011 08:13 pm (UTC)
(Link)
Уже завел.
Шоб неповадно что было?
(Reply) (Parent) (Thread) (Expand)
From:rezkiy
Date:June 7th, 2011 08:23 pm (UTC)
(Link)
возможность писать container.push_back(x).push_back(y) -- путь на темную сторону силы. Вот бросила эта штука исключение, сколько элементов в листе?
(Reply) (Thread)
[User Picture]
From:spamsink
Date:June 7th, 2011 08:28 pm (UTC)
(Link)
Эта штука семантически не отличается от
container.push_back(x); container.push_back(y);
Разница чисто синтаксическая.
(Reply) (Parent) (Thread)
[User Picture]
From:yatur
Date:June 8th, 2011 12:11 am (UTC)
(Link)
А на светлой стороне силы вокруг каждого оператора try-catch стоит?

Другое дело, что темная сторона силы может вылезти в каких-нибудь побочных ффектах. Типа

container.push_back(x++).push_back(x++); - это, надо полагать, undefined behavior. А

container.push_back(x++);
container.push_back(x++); - нет.


(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:sab123
Date:June 8th, 2011 01:08 am (UTC)
(Link)
Они таким образом борются за эффективность. Из тех же соображений разделены front() и pop_front().
(Reply) (Thread)
[User Picture]
From:spamsink
Date:June 8th, 2011 01:35 am (UTC)
(Link)
Эффективность чего? Соптимизировать возврат *this, если он не используется в точке вызова, по-моему, может и ребенок.

pop_* отделено от "peek" по более разумным соображениям эффективности: если бы pop_* возвращал значение, то даже при его неиспользовании вызывать конструктор временной копии все равно надо было бы.
(Reply) (Parent) (Thread)
[User Picture]
From:ak_47
Date:June 8th, 2011 04:19 am (UTC)
(Link)
Скорее всего сделано для симметрии с другими подобными функциями: push_front, pop_back, pop_front.

Вдогонку. Хоть формально и не могу объяснить, но интуитивно мне не нравится код вида: container.push_back(x).push_back(y). Как и многие другие тоже отметили. Есть в этом что-то не то. Если речь идёт о генерации кода (каковая сама по себе далеко не мейнстримная задача, заметим), то сгенерить container.push_back(x); container.push_back(y); точно так же легко. Так что этот аргумент я не могу принять.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:June 8th, 2011 04:50 am (UTC)
(Link)
push_back был ради примера. Вопрос одинаково приложим ко всем четырем.

Даже безотносительно к генерации кода, где может хотеться разделить генерацию объекта и операций над ним, и не протаскивать одно через другое, чем не угодило get_container_ref().push_back(x).push_back(y)?
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:malaya_zemlya
Date:June 8th, 2011 06:51 am (UTC)
(Link)
Чтобы кто не подумал, что программирует на джаве.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:June 8th, 2011 07:11 am (UTC)
(Link)
Я на ней никогда не программировал, поэтому точно не подумаю.
(Reply) (Parent) (Thread)
[User Picture]
From:_navi_
Date:June 8th, 2011 07:55 am (UTC)
(Link)
скорее, на хаскелле, тогда уж
(Reply) (Parent) (Thread)
[User Picture]
From:juan_gandhi
Date:June 8th, 2011 06:27 pm (UTC)
(Link)
Because most of the programmers are assholes.

That's why.

They don't care about you.

API designers are a special kind of assholes. They are happy to make you jump through the loops.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:June 8th, 2011 06:32 pm (UTC)
(Link)
Thank you!
(Reply) (Parent) (Thread)
[User Picture]
From:boris71
Date:June 9th, 2011 06:57 am (UTC)
(Link)
Use the source, Luke...

Впрочем, именно это ты и сделал... А вообще - да, иной раз такие вещи сильно раздражают.
(Reply) (Thread)