Qt 5:无法声明采用右值引用的信号
Qt 5: unable to declare signal that takes rvalue reference
可能我错过了一些东西,但我找不到任何信号不能接受右值引用的信息。
因此,我有一个具有以下信号声明的类:
signals:
void messageDecoded(HTDataMsg &&msg);
当我尝试编译它时,我遇到了错误:
moc_htcodec.cpp: In static member function ‘static void HTCodec::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)’:
moc_htcodec.cpp:71:77: error: cannot bind ‘HTDataMsg’ lvalue to ‘HTDataMsg&&’
case 0: _t->messageDecoded((*reinterpret_cast< HTDataMsg(*)>(_a[1]))); break;
^
In file included from moc_htcodec.cpp:9:0:
../hterm_core/htcodec/htcodec.h:59:9: error: initializing argument 1 of ‘void HTCodec::messageDecoded(HTDataMsg&&)’
void messageDecoded(HTDataMsg &&msg);
^
make: *** [moc_htcodec.o] Error 1
生成的moc文件中的代码确实是错误的:
void HTCodec::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
HTCodec *_t = static_cast<HTCodec *>(_o);
switch (_id) {
case 0: _t->messageDecoded((*reinterpret_cast< HTDataMsg(*)>(_a[1]))); break;
default: ;
}
} else if (_c == QMetaObject::IndexOfMethod) {
int *result = reinterpret_cast<int *>(_a[0]);
void **func = reinterpret_cast<void **>(_a[1]);
{
typedef void (HTCodec::*_t)(HTDataMsg && );
if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&HTCodec::messageDecoded)) {
*result = 0;
}
}
}
}
这种行为是预期的吗?信号采用右值引用是否违法?
如果我HTDataMsg &&msg
更改为,比如说,const HTDataMsg &msg
,那么它当然有效。
信号采用右值引用是否违法?
是的。它们采用右值引用是没有意义的,因为接收器的数量是一个非负整数。Rvalue引用只对零个或一个接收器的特殊情况有意义,即使这样,它也需要一个仅限C++11版本的Qt。
如果您认为这样的优化对常见数据类型有意义(通过基准测试来衡量和支持您的断言!),则可以在 Qr 5.7 及更高版本中实现,因为它需要平台的 C++11 支持。这需要moc
以及图书馆本身的支持。
如果您需要对一个信号和一个插槽的情况使用内存移动,您可以通过简单的引用而不是"const"传递对象,然后在插槽内使用移动语义。下面是一些简单的例子:
class PcapPacket {
public:
PcapPacket();
std::vector<uint8_t>&& getData() {
return std::move(_vData);
}
private:
std::vector<uint8_t> _vData;
};
signals:
void packet(PcapPacket& pcapPacket);
// Register types for signals
qRegisterMetaType<PcapPacket>("PcapPacket&");
connect(pcapReader, &PcapReader::packet, controlItem, &SensorControlItem::processPcapPacket);
// connect(_pcapReader, SIGNAL(packet(PcapPacket&)), controlItem, SLOT(processPcapPacket(PcapPacket&)));
void SensorControlItem::processPcapPacket(PcapPacket& packet) {
_sensor->processPcapPacket(packet.getData());
}
void sensor::processPcapPacket(std::vector<uint8_t>&& data) {
// Do here with data what ever you want. It's yours without memory copy
}
相关文章:
- Qt VTK交互风格的信号到小部件
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 当通过引用传递 QObject 时,C++信号的参数在 QML 中显示为"未定义"
- 在 qt 控制台应用程序中未定义对 'vtable for myObj' 的引用 - 信号和插槽
- Qt:通过常量引用的信号槽
- 未在此作用域中声明的信号/对class::方法的未定义引用
- Qt 5:无法声明采用右值引用的信号