【发布时间】:2023-04-03 01:05:02
【问题描述】:
我刚刚了解了 c++ 17 中的 std::optional 特性以及其他一些非常有用的特性......
但是关于 std::optional 有一些我不明白的地方,我希望有人向我解释一下:
首先,据我所知,在 std::optional 中,返回值可以是指定的类型,也可以是这样的:
std::optional<std::string> getName()
{
if(person.hasName())
{
return person.name;
}
else
{
return {};
}
}
return {} 如何什么也不返回?例如,如果我要创建一个返回指定值或不返回任何值的类似类,我如何创建自己的类以使 return {} 有效?我在这里误会了什么?
我的第二个问题是,当您想检查返回值时,您可以这样做:
int main()
{
std::optional<std::string> name = getName();
if(name.has_value()) // check if the name is valid using the has_value function
{
...
}
}
或者我也可以:
int main()
{
std::optional<std::string> name = getName();
if(name) // check if the name is valid only using the variable name ???
{
...
}
}
我真的很困惑,变量名怎么会返回布尔值?不像对象的构造函数可以返回任何东西,这怎么可能?
再次假设我想创建自己的类,它有点类似于 std::optional 我如何创建它以便我的类的实例可以用作布尔值?
我非常感谢能够解决我的问题的答案,而不是与何时使用 std::optional 或为什么我不应该创建自己的类来做同样的事情等相关的答案......
谢谢!
【问题讨论】:
-
你的标题有点误导。这些是影响 API 的语言特性,而不是任何底层的东西。事实上,这个标题听起来就像你会问一些问题,比如它如何在原地构建和破坏以在接合和脱离之间切换。
-
@chris 我不是 100% 确定你想说什么……但你有什么建议?
-
嗯,实际上有两个问题。一个是关于使用
{}代替optional对象,一个是关于一个类似于bool的可选对象。很难找到包含这两个问题的特定标题。每一个都非常简单(“如何让我的类使用 {} 代替对象?”、“如何让我的类表现得像一个布尔值?”) -
return {}这里说“返回std::optional<std::string>的实例,使用默认构造函数初始化”。这是return std::optional<std::string>();的简写。此语法并非特定于std::optional。碰巧std::optional的默认构造函数将对象设置为空状态。 -
if(name)这里等同于if (name.operator bool())- 它调用std::optional提供的a conversion operator。该操作符与has_value()做同样的事情
标签: c++ c++-standard-library stdoptional