传递boost :: optional lvalue作为函数的引用

时间:2015-06-21 14:56:18

标签: c++ boost boost-optional

你能以某种方式将boost::optional左值作为参考传递给改变值的函数吗?这样的事情(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)。我希望我能正确解释这一点。我问的是我的意图的一般可能性。

2 个答案:

答案 0 :(得分:2)

是。你只需要像编译错误一样初始化optional

  

boost :: optional :: reference_type boost :: optional :: get()[with T = int; boost :: optional :: reference_type = int&amp;]:断言`this-&gt; is_initialized()'失败。

这适用于&amp;打印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;
}

op注意到的一个重要注意事项是,即使在编译时未知初始化值,boost也会断言可选的状态(在operator*get()上),这意味着如果未设置可选项(boost::none),则应用程序将崩溃。

因此,可以使用包含有效值的可选项(非boost::none)进行初始化,或者传递optional<int>&

答案 1 :(得分:0)

您要在这里非常小心。如果将boost :: optional替换为std :: optional,则std :: optional不会为您提供编译器保护。看到 std :: optional 我还没有初始化。没有编译器错误。我可以写可选的东西,但是可选的东西仍然不被初始化,即(bool)y == false

#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

http://coliru.stacked-crooked.com/a/a169e7c43052a206