技术文章

了解最新技术文章

当前位置:首页>技术文章>技术文章
全部 146 常见问题 7 技术文章 139

think cell博客:可选的优点

时间:2023-11-15   访问量:1042  标签: think-cell,测试自动化,think cell

传递函数参数const&是很常见的:

void foo(T const& t);

现在,如果这样的参数是 ,我们该怎么办optional

std::optional<T>不允许T作为参考。我们可以使用

void foo(std::optional<T> const& ot);

但这违背了传递的目的const&:如果我们想传递 a T,我们需要首先将其复制到 an 中std::optional<T>,但我们const&精确地传递是为了避免复制。

C++ 将引用实现为指针,而指针与引用不同,可以是null它们也具有与 相同的语法std::optional:上下文转换来bool检查null, 并operator*访问该值。当然,指针首先出现,所以实际上,std::optional它的语法来自指针。

那么为什么不使用指针呢?

void foo(T const* pt);

这可以编译为正确的代码,但使用起来有些不方便。代替

foo(t);

必须写一个

foo(&t);

或者,如果害怕operator&超载,甚至

foo(std::addressof(t));

如果t是右值,情况会变得更糟,因为 C++ 不允许获取右值的地址:

foo(std::addressof(static_cast<T&>(make_t())));

它做了正确的事情,但不是我们想要的编程方式。

此外,一旦进入foo,您就可以对指针执行您不应该执行的操作:

void foo(T const* pt) {… pt[1] … // this compiles :-(}

那么为什么该标准不允许optional引用呢?

void foo(std::optional<T const&> ot)

原因是 C++ 委员会无法就分配包含类型时会发生的情况达成一致:

std::optional<T const&> ot(…);T t=…;ot = t; // what does this do?

这个 rebind otto now 是否指向t,或者这是否相当于*ot=t,在ot不是的前提下改变引用的值std::nullopt

但是,对于许多用例,不需要重新绑定。实际参考也不能反弹。并且可以通过 来实现对包含的值的赋值*ot=t,无论如何这可能是更清晰的语法。

optional<T&>因此,我们可以通过根本不支持分配来将讨论推迟到另一天。optional<T&>对于传递和返回可选的引用参数仍然非常有用。think -cell 库允许引用其tc::optionaltc::optional与另一种方式不同std::optional,我们下次会谈到。


上一篇:think cell博客:关于char8_t

下一篇:think cell博客:穷人的例外

发表评论:

评论记录:

未查询到任何数据!

免费通话

24小时免费咨询

请输入您的联系电话,座机请加区号

免费通话

微信扫一扫

微信联系
返回顶部