【发布时间】:2022-09-22 23:25:12
【问题描述】:
使用std::optional 时经常会发生以下情况:
void bar(const Foo*);
void baz(const std::optional<Foo>& foo) {
// This is clunky to do every time.
bar(foo.has_value() ? &foo.value() : nullptr);
// Why can\'t I do this instead?
bar(foo.as_ptr());
}
这就是让采用std::optional 变得烦人的事情,因为那样将它与需要指针的现有代码一起使用是非常不方便的。那么为什么std::optional 不提供类似.as_ptr() 的东西呢?这似乎是一个非常明显的便利功能。
-
我猜测那是因为指针本身是“可选的”,因为它们可以为空,所以
std::optional对指针并没有那么大的意义。但如果这是你需要经常做的事情,那么也许你应该自己创建这样一个方便的功能? -
&foo.value() ? foo.has_value() : nullptr不仅仅是“笨拙”,它是错误的。如果foo不包含值,则value()会引发异常。 -
如果您有
as_ptr(),则需要在使用此结果的地方检查nullptr的结果。我看不到检查可选项是否具有某些价值的任何好处。 -
没有什么能阻止你写
T const* as_ptr(std::optional<T> const&)。 -
更让我恼火的是
bar通过指针获取它的参数。你不能为此责怪std::optional:P
标签: c++ option-type stdoptional