报错:“&”要求左值
“&
要求左值” 这个错误通常是因为你在尝试获取一个临时对象或者右值的地址,而 &
运算符只能用于左值(即可以放在赋值语句左边的表达式,代表一个可以被引用的内存位置)。
可能出现错误的位置及解决办法
1. 在创建交换链时传递指针
在调用 CreateSwapChainForHwnd
这类函数时,如果不小心传入了临时对象的地址,就会出现此错误。
错误示例:
dxgiFactory->CreateSwapChainForHwnd(commandQueue, hwnd, &swapChainDesc, nullptr, nullptr, &(IDXGISwapChain1*)swapChain);
这里 (IDXGISwapChain1*)swapChain
是一个临时的类型转换结果,它不是一个左值,不能直接取地址。
解决办法:
使用一个中间变量进行类型转换。
IDXGISwapChain1* tempSwapChain1 = nullptr;
if (SUCCEEDED(dxgiFactory->CreateSwapChainForHwnd(commandQueue, hwnd, &swapChainDesc, nullptr, nullptr, &tempSwapChain1))) {if (tempSwapChain1) {tempSwapChain1->QueryInterface(IID_PPV_ARGS(&swapChain));tempSwapChain1->Release();}
}
2. 在资源屏障操作中使用临时对象
在创建资源屏障时,如果使用了临时的资源屏障描述符而没有将其存储为左值,也会报错。
错误示例:
commandList->ResourceBarrier(1, &D3D12_RESOURCE_BARRIER::Transition(vertexBuffer, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER));
这里 D3D12_RESOURCE_BARRIER::Transition
返回的是一个临时对象,不能直接取地址。
解决办法:
先创建一个资源屏障对象,再取其地址。
D3D12_RESOURCE_BARRIER vertexBufferResourceBarrier = CD3DX12_RESOURCE_BARRIER::Transition(vertexBuffer, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER);
commandList->ResourceBarrier(1, &vertexBufferResourceBarrier);