传递boost::可选左值作为对函数的引用

passing boost::optional lvalue as a reference to a function

本文关键字:函数 引用 boost 传递      更新时间:2023-10-16

您能以某种方式将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)。我希望我的解释是正确的。我在询问我的意图的大致可能性。

是。您只需要像编译错误所建议的那样初始化optional

boost::optional::reference_type boost::optional::get()[其中T=int;boost:;optional:;referencetype=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也会断言可选项的状态(在operator*get()上),这意味着如果未设置可选项(boost::none),应用程序将崩溃。

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

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