C++ 惯用的DirectX12结构初始化在C++;20

C++ 惯用的DirectX12结构初始化在C++;20,c++,visual-c++,c++20,directx-12,C++,Visual C++,C++20,Directx 12,使用MSVC m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(...)); 在C++17上运行良好,但在C++20(预览-最新工作草案中的功能)上,我发现错误: 错误C2102:“&”需要l值 有人知道它是如何在17号上不引起错误的吗?我们现在只是继续使用C++17吗 这不是C++ 20,VisualStudio不再允许你做C++不允许的事情。你不能在任何C++版本中得到一个指向rV

使用MSVC

m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(...));
在C++17上运行良好,但在C++20(预览-最新工作草案中的功能)上,我发现错误:

错误C2102:“&”需要l值

有人知道它是如何在17号上不引起错误的吗?我们现在只是继续使用C++17吗


这不是C++ 20,VisualStudio不再允许你做C++不允许的事情。你不能在任何C++版本中得到一个指向rValk的指针,而且永远不能。如果这是“惯用”的话,那么它只是一个针对坏编译器的惯用语

可能有一些编译器开关使MSVC允许这样做,但您确实不应该使用它。您必须创建一个变量,传递一个指向它的指针,然后继续,就像其他人一样:

auto temp = CD3DX12_RESOURCE_BARRIER::Transition(...)
m_commandList->ResourceBarrier(1, &temp);

由于MSVC语言扩展现在已默认关闭,因此以前仅编译过此文件。引述自:

MSVC有一个扩展,允许使用类rvalue作为左值。该扩展不会延长类rvalue的生存期,并可能导致运行时出现未定义的行为。我们现在强制执行标准规则,并在
/permissive-
下禁止此扩展。如果您还不能使用
/permissive-
,则可以使用
/we4238
明确禁止扩展

从VisualStudio2019版本16.8开始,/std:c++最新选项隐式设置/permissive-选项。它是C++20模块支持所必需的。也许您的代码不需要模块支持,但需要在/std:c++最新版本下启用其他功能。通过使用/permissive选项(不带尾随破折号),可以显式启用Microsoft扩展支持

只需确认它将使用/permission选项在/std:c++latest上编译