使用 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 Typenullptr
?【参考方案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