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