我刚学习了一些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或为什么不应该创建执行相同操作的类等的回答。
谢谢!
{}
,另一个是关于可选对象像bool
一样运作。很难找到一个特定的标题来涵盖这两个问题。每个问题都很简单明了(“如何使我的类能够在对象的位置使用 {}?”,“如何使我的类像 bool 一样运作?”)。 - chrisreturn {}
表示“返回一个使用默认构造函数初始化的std::optional<std::string>
实例”。它是return std::optional<std::string>();
的简写形式。这种语法不仅适用于std::optional
,而且恰好std::optional
的默认构造函数将对象设置为空状态。 - Igor Tandetnikif(name)
here is equivalent toif (name.operator bool())
- it calls a conversion operator thatstd::optional
provides. This operator does the same thing ashas_value()
- Igor Tandetnik