Вы можете как-нибудь передать boost::optional
lvalue как ссылка на функцию, которая изменяет значение? Что-то вроде этого (http://coliru.stacked-crooked.com/a/f77d3b095af3d66b):
#include <iostream>
#include <boost/optional.hpp>
void foo(int& x)
{
x = 3;
}
int main() {
boost::optional<int> y;
foo(*y);
std::cout << *y << std::endl;
}
что не работает, что неудивительно.
Функция должна использовать стандартный тип в качестве выходного аргумента tho (например, int& x
). Я надеюсь, что объясняю это правильно. Я спрашиваю об общей возможности моего намерения.
Да. вам просто нужно инициализировать optional
как ваша ошибка компиляции предполагает:
boost :: option :: reference_type boost :: option :: get () [with T = int; boost :: необязательный :: reference_type = int&]: Утверждение `this-> is_initialized () ‘не удалось.
Это работает & печать 3
:
#include <iostream>
#include <boost/optional.hpp>
void foo(int& x)
{
x = 3;
}
int main() {
boost::optional<int> y = 2;
foo(*y);
std::cout << *y << std::endl;
}
Важное замечание, отмеченное операцией, заключается в том, что даже если значение инициализации неизвестно во время компиляции, boost в любом случае подтвердит состояние дополнительного элемента (включено operator*
или на get()
), что означает, что если необязательный параметр не установлен (boost::none
) приложение потерпит крах.
Таким образом, можно либо инициализировать необязательным, содержащим действительное значение (не boost::none
) или пройти optional<int>&
,
Вы хотите быть очень осторожным здесь. Если вы поменяете местами boost :: option для std :: option, тогда std :: option не защитит вас с помощью компилятора. Посмотрите, что с станд :: опционально я не инициализировал. Нет ошибки компилятора. Мне разрешено писать в опциональное, но опциональное не считается инициализированным, т.е. (bool) y == ложь
#include <iostream>
#include <boost/optional.hpp>
#include <boost/optional/optional_io.hpp>
#include <optional>
void foo(int& x)
{
x = 3;
}
int main() {
{
boost::optional<int> y = 2;
foo(*y);
std::cout << *y << " " << !!y << std::endl;
}
{
std::optional<int> y;
foo(*y);
std::cout << *y << " " << !!y << std::endl;
}
}
вывод
3 1
3 0