Плюс он возвращает общее количество элементов во всех измерениях массива, поэтому он может быть массивом с «всего лишь» полумиллиардом элементов и 4 измерениями, чтобы сделать его необходимым 64-битным int.
Причина неявного преобразования (T&
-> reference_wrapper<T>
) допускается для std::reference_wrapper<T>
, , но не boost::reference_wrapper<T>
, достаточно объяснена в DR-689 ссылка предоставлена Нейтом Колем. Подводя итог:
В 2007 году Рабочая группа библиотек C ++ 0x / C ++ 11 (LWG) предложила изменить № DR-689 на раздел 20.8.3.1 [refwrap.const]
стандарта:
Конструктор reference_wrapper в настоящее время является явным . Основным мотивом для этого является проблема безопасности в отношении значений r, которая решается в предлагаемом решении [DR-688]. Поэтому нам следует рассмотреть возможность ослабления требований к конструктору, поскольку запросы на неявное преобразование продолжают обновляться.
Предлагаемое решение: Удалить явное из конструктора reference_wrapper.
Стоит отметить:
boost::reference_wrapper
не были расслаблены таким образом, и при этом кажется, предложение для этого, что создает несоответствие между семантикой boost::reference_wrapper
и std::reference_wrapper
.
Основываясь на словоблудии в DR-689 (в частности, в части «запросы продолжают всплывать»), представляется вероятным, что это изменение просто рассматривалось LWG как приемлемый компромисс между безопасностью и удобством (в отличие от его повышения). аналог).
Неясно, предвидела ли LWG другие потенциальные риски (такие, как продемонстрированные в примерах, приведенных на этой странице), поскольку единственный риск, упомянутый в DR-689, был связан с привязкой к значению (как описано и решено). в предыдущей записи DR-688).