Неявный T & amp; конструктор std :: reference_wrapper < T > сделать его опасным для использования?

Плюс он возвращает общее количество элементов во всех измерениях массива, поэтому он может быть массивом с «всего лишь» полумиллиардом элементов и 4 измерениями, чтобы сделать его необходимым 64-битным int.

24
задан etherice 27 March 2013 в 15:00
поделиться

1 ответ

Причина неявного преобразования (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).

2
ответ дан etherice 27 March 2013 в 15:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: