了解最新技术文章
传递函数参数const&
是很常见的:
现在,如果这样的参数是 ,我们该怎么办optional
?
std::optional<T>
不允许T
作为参考。我们可以使用
但这违背了传递的目的const&
:如果我们想传递 a T
,我们需要首先将其复制到 an 中std::optional<T>
,但我们const&
精确地传递是为了避免复制。
C++ 将引用实现为指针,而指针与引用不同,可以是null
. 它们也具有与 相同的语法std::optional
:上下文转换来bool
检查null
, 并operator*
访问该值。当然,指针首先出现,所以实际上,std::optional
它的语法来自指针。
那么为什么不使用指针呢?
这可以编译为正确的代码,但使用起来有些不方便。代替
必须写一个
或者,如果害怕operator&
超载,甚至
如果t
是右值,情况会变得更糟,因为 C++ 不允许获取右值的地址:
它做了正确的事情,但不是我们想要的编程方式。
此外,一旦进入foo
,您就可以对指针执行您不应该执行的操作:
那么为什么该标准不允许optional
引用呢?
原因是 C++ 委员会无法就分配包含类型时会发生的情况达成一致:
这个 rebind ot
to now 是否指向t
,或者这是否相当于*ot=t
,在ot
不是的前提下改变引用的值std::nullopt
?
但是,对于许多用例,不需要重新绑定。实际参考也不能反弹。并且可以通过 来实现对包含的值的赋值*ot=t
,无论如何这可能是更清晰的语法。
optional<T&>
因此,我们可以通过根本不支持分配来将讨论推迟到另一天。optional<T&>
对于传递和返回可选的引用参数仍然非常有用。think -cell 库允许引用其tc::optional
. tc::optional
与另一种方式不同std::optional
,我们下次会谈到。
24小时免费咨询
请输入您的联系电话,座机请加区号