C++双引用(&&)技术疑问:(char*)&info是否等价于T&&?
问题解答:
(char*)&info 和 T&& 完全不等价 先直接给结论:这两者没有任何等价关系,是完全不同的C++语法特性,解决的问题也完全不沾边。下面分别拆解说明:
1. 先看你代码里的 (char*)&info
你的重载运算符代码中:
out.writeRawData((char*)&info, sizeof(info));
这里的操作可以拆成两步理解:
&info:取PbxCfgHeader类型变量info的内存地址,得到的是PbxCfgHeader*类型的指针;(char*):这是C风格的强制类型转换,把PbxCfgHeader*转换成char*。这么做的原因是QDataStream::writeRawData需要接收const char*类型的参数,它的作用是按字节读取传入地址开始的内存内容,把结构体info的原始二进制数据写入数据流。本质上这是指针类型的强制转换,目的是实现"内存二进制拷贝"的操作。
2. 再说说 T&& 是什么
T&&是C++11引入的右值引用,它的核心作用和使用场景完全不同:
- 用来绑定到右值(比如临时对象、字面量、
std::move后的左值); - 支持移动语义,避免不必要的对象拷贝,提升代码性能;
- 配合模板实现完美转发,让函数参数保持原有的值类别(左值/右值)。
举个简单的右值引用示例:
// 类的移动构造函数,用右值引用接收临时对象 class MyClass { private: int* data; public: MyClass(MyClass&& other) noexcept { // 直接转移other的资源,而非拷贝 this->data = other.data; other.data = nullptr; } };
这里的MyClass&&就是右值引用,和指针类型转换没有任何关联。
总结
(char*)&info是指针类型转换,用来把结构体的地址转成字节指针,做原始内存读写;T&&是右值引用,用来处理右值,实现移动语义和完美转发;
两者的语法意义、使用场景、作用完全不同,绝对不能等价起来。
内容的提问来源于stack exchange,提问作者Koder 228
相关产品推荐
相关产品推荐

