1

你能以某种方式将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)。我希望我能正确解释这一点。我在询问我的意图的一般可能性。

4

2 回答 2

2

是的。你只需要optional像你的编译错误提示的那样初始化:

boost::optional::reference_type boost::optional::get() [with 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;
}

op 注意到的一个重要评论是,即使在编译时不知道初始化值,boost 无论如何都会断言可选项的状态(onoperator*或 on get()),这意味着如果未设置可选项(boost::none),应用程序将崩溃.

因此,可以使用包含有效值的可选(非boost::none)进行初始化,也可以通过optional<int>&

于 2015-06-21T15:00:37.823 回答
1

你要在这里非常小心。如果你将 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

于 2018-10-12T08:15:37.763 回答