DirectX12代码编译报C2102错误:&要求左值的问题咨询
解决DirectX 12代码编译错误C2102:“&要求左值”
问题根源
你遇到的C2102错误,核心原因是C++标准与编译器版本的兼容性差异:
- 书中示例使用的v140编译器(Visual Studio 2015)默认启用了微软非标准扩展,允许对函数内构造的临时对象(右值)直接取地址;
- 你当前使用的较新版本编译器(如v141及以后)默认严格遵循C++标准,临时对象属于右值,不能用
&直接获取地址,因此触发编译错误。
解决方案
方案1:显式创建左值变量(推荐,可读性高)
将临时对象转为显式定义的局部变量,再取其地址传入函数:
// 先创建左值变量 CD3DX12_HEAP_PROPERTIES heapProperties(D3D12_HEAP_TYPE_DEFAULT); CD3DX12_RESOURCE_DESC bufferDesc = CD3DX12_RESOURCE_DESC::Buffer(byteSize); // 传入变量地址 _device->CreateCommittedResource( &heapProperties, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_COMMON, nullptr, IID_PPV_ARGS(defaultBuffer));
方案2:使用std::addressof(现代C++风格)
std::addressof是C++11引入的标准函数,可直接获取右值对象的地址,需包含<memory>头文件:
#include <memory> _device->CreateCommittedResource( std::addressof(CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT)), D3D12_HEAP_FLAG_NONE, std::addressof(CD3DX12_RESOURCE_DESC::Buffer(byteSize)), D3D12_RESOURCE_STATE_COMMON, nullptr, IID_PPV_ARGS(defaultBuffer));
方案3:调整编译器兼容性设置(快速适配旧代码)
若想直接沿用书中写法,可修改项目编译器选项,启用微软非标准扩展:
- 打开项目属性 → 配置属性 → C/C++ → 命令行
- 在“附加选项”中添加
/permissive,让编译器允许对临时对象取地址
注意事项
方案3虽能快速解决编译问题,但会降低代码的标准兼容性和可移植性。从长期维护角度,更推荐方案1或方案2。
内容的提问来源于stack exchange,提问作者SigmaKlim
相关产品推荐
相关产品推荐

