gpt4 book ai didi

c++ - 由于移动构造函数而删除的对象

转载 作者:行者123 更新时间:2023-11-30 01:22:52 25 4
gpt4 key购买 nike

我正在尝试创建一个在专用线程中运行的函数从串行端口读取。但是我无法通过连接到线程。我将我的代码简化为以下示例:

#include <thread>
#include <boost/asio.hpp>

template <typename Port>
void serial_read( Port& port) {}

int main()
{
boost::asio::io_service serial_io;
boost::asio::serial_port port( serial_io );
port.open( "/dev/ttyUSB0" );

std::thread s( serial_read<boost::asio::serial_port>, port );
return 0;
}

但是,我收到以下错误消息:

/usr/include/c++/4.7/tuple:128:25: error: use of deleted function ‘boost::asio::basic_serial_port<>::basic_serial_port(const boost::asio::basic_serial_port<>&)’
In file included from /usr/include/boost/asio.hpp:25:0,
from main.cpp:2:
/usr/include/boost/asio/basic_serial_port.hpp:47:7: note: ‘boost::asio::basic_serial_port<>::basic_serial_port(const boost::asio::basic_serial_port<>&)’ is implicitly declared as deleted because ‘boost::asio::basic_serial_port<>’ declares a move constructor or move assignment operator

错误信息很清楚。我正在尝试使用一个对象这是不存在的,因为它已被删除由于移动构造函数的声明。但我还是不明白这里发生了什么以及如何正确地做。有人可以开导我?

最佳答案

您没有正确阅读错误。它告诉您 boost::asio::basic_serial_port复制构造函数deleted。这意味着不能使用复制构造函数。它与被删除的对象无关。复制构造函数 deleted 的原因是因为定义了移动构造函数。

如果您确实需要传递对 serial_read 的引用,则需要将您的 port 对象包装在 reference_wrapper 中:

std::thread s( serial_read<boost::asio::serial_port>, std::ref(port) );

但是,如果您不保留 port 并将其用于其他任何事情(例如将相同的 port 对象传递给其他线程),您应该 std::move 你的 port 对象到线程中:

std::thread s( serial_read<boost::asio::serial_port>, std::move(port) );

这还需要更改 serial_read 的定义以按值获取 Port:

template <typename Port>
void serial_read( Port port) {}

关于c++ - 由于移动构造函数而删除的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15661906/

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