Причина неявного преобразования (T&
-> reference_wrapper
) допускается для std::reference_wrapper
, , но не boost::reference_wrapper
, достаточно объяснена в 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).
Если вы используете Windows, вы можете сделать следующее:
Пошаговый пример:
VirtualProtect()
на кодовых страницах, которые вы хотите изменить, с защитой PAGE_WRITECOPY
. VirtualProtect()
на модифицированных кодовых страницах с защитой PAGE_EXECUTE
. FlushInstructionCache()
. Для получения дополнительной информации см. Как изменить исполняемый код в памяти (В архиве: август 2010 г.)
Если вы работаете в Windows, я считаю, что он блокирует файл, чтобы предотвратить его изменение во время работы. Вот почему вам часто нужно выйти из программы, чтобы установить обновление. То же самое не верно в системе Linux.