Make_unique массивы, оригинальное предложение против финального - программирование
Подтвердить что ты не робот

Make_unique массивы, оригинальное предложение против финального

Первоначальное предложение Stephan T Lavavej для make_unique было N3588

Он включал следующие функции:

make_unique<T>(args...)
make_unique_default_init<T>()

make_unique<T[]>(n)
make_unique_default_init<T[]>(n)
make_unique_value_init<T[]>(n, args...)
make_unique_auto_size<T[]>(args...)

Однако окончательный прокси, N3656, включает только make_unique (обе формы). Я не могу найти обсуждение других форм функции. Я прочитал протокол Бристольской встречи, но они даже не ссылаются на первоначальное предложение.

Почему эти дополнительные функции не были включены в окончательный проект?

4b9b3361

Ответ 1

Я прочитал протокол Бристольской встречи, но они даже не ссылаются на первоначальное предложение.

Минуты точны. N3588 (оригинальный рецепт, без Standardese) не обсуждался в полном комитете, там обсуждался только N3656 (дополнительный хрустящий со стандартом). Если вы не встречались, это может показаться странным, но происходит то, что рабочие группы (Core, Evolution, Library, Library Evolution) и исследовательские комиссии (файловая система и т.д.) Работают в течение недели параллельно, в конечном счете проводя соломенные опросы (где каждый может проголосовать), чтобы определить, что следует довести до полного комитета. Со второго по последний день встречается полный комитет (более 100 человек), на котором кратко обсуждаются формальные предложения, и принимаются соломенные опросы (в которых могут голосовать только голосующие члены). Если кто-то обеспокоен тем, что функции недостаточно испечены или что будут проблемы интеграции с другими функциями и т.д., То это обсуждается здесь, но полный комитет не рассматривает микроскопические детали предложения. В принципе, если что-то достаточно противоречиво, чтобы гарантировать, что оно не выдержит голоса, так что оно будет снято с рассмотрения на этом заседании. Затем, в последний день, полный комитет снова встречается, и принимаются реальные голоса (только члены голосования). В общем, не должно быть никаких сюрпризов во время реальных голосов, так как накануне был пробный прогон.

Протоколы LWG недоступны для публики, но я могу рассказать вам, что произошло. N3588 преднамеренно не содержал Standardese - то, что я там делал, изучало пространство дизайна, выясняя, какие новые выражения мы должны подражать, а также спорить о разных вещах или против них. Я планировал получить обратную связь от LWG, а затем проект Standardese для следующей встречи (Чикаго), так как запись чего-либо сложного занимает у меня много времени, чтобы получить все правильно (требуется больше времени, чем его реализация, поскольку Standardese тщательно танцует вокруг деталей реализации, таких как SFINAE). Представляя это предложение, я объяснил, как я не был большим поклонником init-init (который я высмеивал как garbage-init), но изложил, как это можно сделать в любом случае. Я также объяснил, что я узнал больше о случаях массива-init после написания предложения (при получении отзывов от разработчиков MS). Интересно, что основной язык предоставляет гарантии последовательности для бит-init-списков, поэтому новые функции X [3] {f(), g(), h()} вызывают эти функции слева направо. Функциональные вызовы не получают этих гарантий, которые (на мой взгляд) смертельно ранят попытки обернуть массив-init, как в моем первоначальном предложении. Существуют разумные способы достижения гарантий последовательности с немного отличающимся синтаксисом пользователя и еще большей сложностью реализации, которые я объяснил LWG. На данный момент, я действительно хотел отказаться от массива-init, и я был тепловатым по умолчанию-init (который легко указать и реализовать, но я считаю его по существу ненужным). Реакция LWG заключалась в том, что они хотели только самые простые формы - без init-массива и даже не по умолчанию-init. Я был очень счастлив услышать это, и я смог написать необходимый Стандард на самой встрече (примерно как 4 часа ночи). Итак, откуда пришел N3656. LWG еще раз посмотрел на него и с одним незначительным изменением (с изменением типа возвращаемого типа make_unique < T [N] > от void до неуказанного, которое я сделал до того, как оно было "установлено в камне" ) было готово привести его в полное состояние комитет.

Тогда, как вы видели в протоколах, проблема заключалась в том, что мы могли бы слишком быстро двигаться с make_unique. N3588 был во время предварительной рассылки, но это был первый раз, когда он появился - почти все предложения занимают более одной встречи, чтобы перейти от первого взгляда к формальному движению (мое первое предложение, прозрачное функционирование оператора, было еще более необычное исключение, поскольку оно появилось и проголосовало без изменений в Портленде). Между прочим, это была вполне реальная проблема. В итоге голосование прошло - членам не нужно объяснять свои голоса, но я имел в виду, что это комбинация предложения очень мала, у кого нет возражений против фактического контента и доступности.

Теперь мне нужно будет все это снова подумать о make_shared!