使用 std::optional 通过引用将 std::vector<int> 传递给函数

Posted

技术标签:

【中文标题】使用 std::optional 通过引用将 std::vector<int> 传递给函数【英文标题】:Use of std::optional to pass a std::vector<int> to a functional by reference 【发布时间】:2019-05-10 08:46:06 【问题描述】:

我不清楚通过引用将可选的整数向量传递给函数的正确代码是:

void test_func(std::optional<std::vector<int>&> vec)

void test_func(std::optional<std::vector<int>>& vec)

非常感谢任何帮助。

【问题讨论】:

第二个。 这里的用例是什么?如果不需要修改向量,则可以通过 const 引用传递并使用默认参数。 考虑两个重载函数,一个不带参数,另一个通过引用获取向量。有时,最简单的解决方案往往是最干净的。 既然你不能有可选的参考,不应该有任何缺乏明确性。 这是不好的使用 optional 使你的代码不可读 【参考方案1】:

据我所知,这在标准中是不可能的,因为人们尚未就分配的效果达成一致。

您想要实现的目标可以通过库功能实现:

  void test_func(std::optional<std::reference_wrapper<std::vector<int>>> vec)

【讨论】:

【参考方案2】:

非拥有指针是可为空的引用类型。

void test_func(std::vector<int>* vec)

【讨论】:

令人惊讶的是,这个简单的事实经常被遗忘 我想我明白你在说什么,但我想举一个关于如何传递 null 的例子? @TonyGutierrez Type nullptr?【参考方案3】:

可选的参考是not part of the standard library at the moment。

原则上两者都有意义。

void test_func(std::optional<std::vector<int>&> vec)

这里std::optional 是按值传递(复制)的,其中的引用也是如此。复制引用意味着它仍然指向旧对象。这可能会产生意外行为,因为有两个 std::optional 实例指向同一个 std::vector

void test_func(std::optional<std::vector<int>>& vec)

这里std::optional 是通过引用传递的。您正在访问传递的相同选项,不会发生复制。

第二个更直观,目前在 STL 中可用,因此首选

【讨论】:

谢谢。实际上,两者都没有做我希望做的事情/都是有问题的。我想传递一个可选的整数向量,但理想情况下我不想复制它们。我正在尝试为一些遗留代码添加一些新的灵活性,希望通过可选参数以最少的更改来做到这一点。

以上是关于使用 std::optional 通过引用将 std::vector<int> 传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 const rvalue 限定 std::optional::value() 返回 const rvalue 引用?

如何使用 std::optional<T>::emplace 的第二个重载

std::optional

如何优雅处理多参数返回/无参数返回——std::optional

将一个 std::optional 转换为另一个 std::optional

将 std::iter_swap 用于 std::optional