gpt4 book ai didi

c++ - 如何将包含 std::unique_ptr 的 std::optical 结构传递给函数?

转载 作者:行者123 更新时间:2023-12-02 18:38:26 24 4
gpt4 key购买 nike

我正在学习如何使用std::optional ,并且我无法通过 std::optional<Type>函数的参数,因为 Type 中包含 std::unique_ptr ,这会阻止调用。

将此类变量 ( std::optional<Type> ) 传递给函数的正确方法是什么?

这是一个可以轻松重现问题的代码片段:

#include <iostream>
#include <optional>
#include <memory>
using namespace std;

struct myStruct
{
std::unique_ptr<int> a;
};

int func(const myStruct& val, std::optional<myStruct> opt)
{
if (opt.has_value())
{
return *(opt.value().a);
}
else
{
return *(val.a);
}
}

int main()
{
cout << "Hello World";
myStruct val;
val.a = std::make_unique<int>(5);
std::optional<myStruct> opt = std::nullopt;
myStruct temp;
temp.a = std::make_unique<int>(10);
opt = std::move(temp);
std::cout << "result is " << func(val, opt) << std::endl;
return 0;
}

我在上面的代码中看到的错误:

main.cpp:35:47: error: use of deleted function ‘std::optional::optional(const std::optional&)’
std::cout << "result is " << func(val, opt) << std::endl;
^
In file included from main.cpp:10:0:
/usr/include/c++/7/optional:453:11: note: ‘std::optional::optional(const std::optional&)’ is implicitly deleted because the default definition would be ill-formed:
class optional
^~~~~~~~
/usr/include/c++/7/optional:453:11: error: use of deleted function ‘constexpr std::_Enable_copy_move::_Enable_copy_move(const std::_Enable_copy_move&) [with _Tag = std::optional]’
In file included from /usr/include/c++/7/optional:43:0,
from main.cpp:10:
/usr/include/c++/7/bits/enable_special_members.h:157:15: note: declared here
constexpr _Enable_copy_move(_Enable_copy_move const&) noexcept = delete;

最佳答案

您的myStruct只能间接移动(不可复制),因为成员 std::unique_ptr<int> a; ,默认情况下也是不可复制的(只允许移动)。

因此可选变量 opt (其中包含结构 myStruct )也只能间接移动。但是,在您的函数 func 中您正在尝试通过opt按值,这实际上尝试复制底层结构,从而导致编译器错误。

您需要通过opt通过 const ref,因为您没有修改 opt无论如何。

int func(const myStruct& val, const std::optional<myStruct>& opt)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
// ..code
}

See live

关于c++ - 如何将包含 std::unique_ptr 的 std::optical 结构传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68419030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com