能否无需声明缓冲变量,以类匿名对象方式预设二进制文件?
解决方案
1. 升级到C++17直接使用匿名对象
C17引入了临时物化特性,允许直接获取匿名临时对象的地址,你的原写法在C17及以上编译器中可以直接生效:
file.write((char*)&myType(), sizeof(myType));
这是最简洁的方案,只要编译器支持C++17标准即可。
2. C++11/14用std::move转换
如果只能用C11或C14,可以通过std::move把匿名对象转为右值引用,从而合法获取其地址:
#include <utility> // 必须包含这个头文件 file.write((char*)&std::move(myType()), sizeof(myType));
临时对象的生命周期会覆盖整个write调用,不会出现悬空指针问题。
3. 封装工具函数兼容旧标准
如果需要兼容C++03等更旧的标准,可以写一个简单的模板函数返回默认构造的对象:
template<typename T> T get_default_instance() { return T(); } // 使用方式 file.write((char*)&get_default_instance<myType>(), sizeof(myType));
函数返回的临时对象可以被取地址,满足write函数的参数要求。
4. 聚合类型用列表初始化
如果myType是聚合类型(比如没有自定义构造函数的结构体、数组),可以用列表初始化的临时对象,C++11及以上支持:
// 示例:myType是struct { int id; double val; }; file.write((char*)&myType{}, sizeof(myType));
这种写法直观且不需要额外头文件。
内容的提问来源于stack exchange,提问作者CS Student
相关产品推荐
相关产品推荐

