You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否无需声明缓冲变量,以类匿名对象方式预设二进制文件?

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:33:23