Обычно, когда функция возвращает boost::optional
Я видел много людей, возвращающих пустую фигуру {}
, чтобы обозначить пустое значение, которое отлично работает и короче, чем возвращение boost::none
.Разница между boost и std :: экспериментальное необязательное назначение
Я попытался сделать что-то похожее на пустой boost::optional<int>
, но при вызове оператора присваивания копии (или, скорее всего, операции присваивания операции op) с пустой скобкой в правой части пустая скобка преобразуется в int, а затем это значение присваивается необязательному, поэтому я заканчиваю тем, что переменная установлена в 0, а не пустая величина, как я ожидал. Вот пример https://godbolt.org/g/HiF92v, если я попробую то же самое с std::experimental::optional
Я получаю результат, который я ожидаю (просто замените на std :: experimental :: optional в примере, и вы увидите, что инструкция становится mov eax, eax
).
Также, если я попытаюсь использовать другой аргумент шаблона для форсирования необязательный (не целочисленный тип), некоторые компиляторы компилируют (с поведением, которое я ожидаю, пример здесь http://cpp.sh/5j7n), а другие нет. Таким образом, даже для одной и той же библиотеки поведение отличается от шаблона arg.
Я хотел бы понять, что здесь происходит, я знаю, что это связано с тем, что я использую функцию C++ 14 для библиотеки, которая не учитывает это в дизайне. Я прочитал заголовок boost/optional
, но я потерялся в деталях, я также попытался изучить скомпилированный код без встраивания с аналогичным результатом.
Я использую gcc 4.9.2 с -std = C++ 14 и повышаю 1.57.
btw: Я знал, что должен был использовать boost::optional::reset
или boost::none
, но я старался соответствовать семантике в остальной части базы кода.
Существует разница между назначением и инициализацией ... – aschepler
да, но вопрос в том, почему назначение отличается между boost :: optional и std :: experimental :: optional и почему эта работа для boost :: optional с не целочисленными типами – dlavila
В принципе, 'std :: experimental :: optional' выполняет некоторые специальные трюки, чтобы гарантировать, что' o = {} 'всегда сбрасывает его. 'boost :: optional' не имеет этих трюков. –