2013-12-13 1 views
5

Я просматриваю производственный код, где функция говорит, что он вернет boost::optional, но он просто возвращает double: например.boost :: optional return from function

boost::optional<double> Foo(){ 
    double a = 1.0; 
    double b = 2.0; 
    return a + b; 
} 

Это приемлемый стиль/есть ли случаи, когда это небезопасно?

ответ

7

Это стиль, который мне нравится использовать. Возвращенный double будет неявно преобразован в boost :: optional, который был установлен и содержит значение этого двойника. Я не могу придумать ни одного случая, когда это небезопасно. EDIT: существуют предостережения, когда тип, содержащийся по дополнительному адресу <>, является bool - см. Документы.

Это преобразование будет использовать этот импульс :: дополнительный конструктор:

boost::optional (T const& v) 

где T в этом случае является двойным. Обратите внимание, что этот конструктор не является явным, и он был разработан именно для того, чтобы разрешить код в вашем примере!

Если в другом месте функция должна вернуть необязательный объект, который не был установлен, return boost :: optional().

Ссылка:

http://en.cppreference.com/w/cpp/language/implicit_cast - см пули 3 о возвращаемых значениях.

+0

Как насчет передачи двойной функции, которая принимает дополнительный двойной? – frickskit

+1

Да, это тоже прекрасно. – polkadotcadaver

+0

Из любопытства: В чем преимущество использования этого стиля? Я имею в виду, что метод OPs 'optional' никогда не будет пустым – user463035818