2015-06-21 1 views
1

Можете ли вы как-то передать boost::optional lvalue как ссылку на функцию, которая меняет значение? Что-то вроде этого (http://coliru.stacked-crooked.com/a/f77d3b095af3d66b):Прохождение boost :: optional lvalue как ссылка на функцию

#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). Надеюсь, я правильно объясню это. Я спрашиваю об общей возможности моего намерения.

ответ

2

Да. Вы просто должны инициализировать optional, как говорит ваша ошибка компиляции:

повышения :: опционального :: reference_type подталкивание :: опционального :: получить() [с T = INT; boost :: optional :: 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; 
} 

Важное замечание отмечено, ор, что даже если значение инициализации не известно во время компиляции, повышение будет в любом случае утверждать, факультативные-х (на operator* или на get()), что означает, что если опция не установлена ​​(boost::none), приложение будет аварийно завершено.

Таким образом, можно либо инициализировать с использованием необязательного значения (не boost::none), либо пройти optional<int>&.

+0

Невозможно инициализировать значение boost :: none :(. Фактически, я инициализирую 'y', вызывая метод, который может возвращать значение int, а также' boost :: none'. Если он возвращает 'boost :: none', он будет утверждать. Вы ответили на вопрос, спасибо! – clime

+0

True: \ вы можете либо инициализировать его (с помощью' boost :: none'), либо передать 'boost :: опционально & 'к вашей функции. –