簡體   English   中英

C++20 上慣用的 DirectX12 結構初始化中斷

[英]Idiomatic DirectX12 structure initialization breaks on C++20

使用 MSVC

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

在 C++17 上工作正常,但在 C++20(預覽 - 最新工作草案中的功能)上我收到錯誤:

錯誤 C2102:“&”需要左值

有誰知道它如何不會在 17 上導致錯誤? 我們現在是否繼續使用 C++17?

https: //docs.microsoft.com/en-us/windows/win32/direct3d12/helper-structures-for-d3d12 https: //docs.microsoft.com/en-us/windows/win32/direct3d12/ -direct3d-12 中同步資源狀態的障礙

這只是之前編譯的,因為現在默認關閉了 MSVC 語言擴展。 引用Visual Studio 2019 版本 16.8 中的一致性改進 - 'Class rvalue used as lvalue' 擴展

MSVC 有一個擴展,允許使用 class 右值作為左值。 該擴展不會延長 class 右值的生命周期,並且可能導致運行時未定義的行為。 我們現在強制執行標准規則並在/permissive-下禁止此擴展。 如果您還不能使用/permissive- ,則可以使用/we4238明確禁止擴展。

這不是 C++20,而是 Visual Studio 不再允許您做 C++ 不允許您做的事情。 在任何 C++ 版本中,您都無法獲得指向右值的指針,而且永遠也無法獲得。 如果這是“慣用語”,那只是損壞編譯器的慣用語。

可能有一些編譯器開關使 MSVC 允許這樣做,但你真的不應該使用它。 你將不得不創建一個變量,傳遞一個指向它的指針,然后繼續,就像其他人一樣:

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

https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-160

從 Visual Studio 2019 版本 16.8 開始,/std:c++latest 選項隱式設置 /permissive- 選項。 它是 C++20 模塊支持所必需的。 也許您的代碼不需要模塊支持,但需要在 /std:c++latest 下啟用其他功能。 您可以使用 /permissive 選項顯式啟用 Microsoft 擴展支持,而無需尾隨破折號。

只需使用 /permissive 選項確認它將在 /std:c++latest 上編譯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM