【问题标题】:Use of std::optional to pass a std::vector<int> to a functional by reference使用 std::optional 通过引用将 std::vector<int> 传递给函数
【发布时间】: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 使你的代码不可读

标签: c++ std c++17 stdoptional


【解决方案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 中可用,因此首选

    【讨论】:

    • 谢谢。实际上,两者都没有做我希望做的事情/都是有问题的。我想传递一个可选的整数向量,但理想情况下我不想复制它们。我正在尝试为一些遗留代码添加一些新的灵活性,希望通过可选参数以最少的更改来做到这一点。
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多