传递 boost::optional 左值作为对函数的引用
passing boost::optional lvalue as a reference to a function
你能以某种方式将 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;
}
不出所料。
该函数需要使用标准类型作为输出参数(例如 int& x
)。我希望我能正确解释这一点。我问的是我的意图的一般可能性。
是的。你只需要初始化 optional
就像你的编译错误建议的那样:
boost::optional::reference_type boost::optional::get() [with T = int; boost::optional::reference_type = int&]: Assertion `this->is_initialized()' failed.
这有效并打印 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
你能以某种方式将 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;
}
不出所料。
该函数需要使用标准类型作为输出参数(例如 int& x
)。我希望我能正确解释这一点。我问的是我的意图的一般可能性。
是的。你只需要初始化 optional
就像你的编译错误建议的那样:
boost::optional::reference_type boost::optional::get() [with T = int; boost::optional::reference_type = int&]: Assertion `this->is_initialized()' failed.
这有效并打印 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