請參閱此示例代碼:
#include <ranges>
int main() {
for(auto i : std::ranges::iota_view(1) | std::views::reverse)
break;
}
它在 gcc 上編譯(我無法檢查 clang/msvc - 因為它們不支持范圍)。當然——它“永遠”運行并且什么都不做。
我還檢查了不允許在無限范圍內執行std::ranges::rbegin(inf)或std::ranges::rend(inf)操作(它不編譯)。
我不確定這是否是正確的 C 代碼?而且我對 std::ranges::reverse 實作很好奇 - 看起來 rbegin/rend 沒有用于實作這個視圖 - 那么這個實作是如何作業的?
uj5u.com熱心網友回復:
根據[iterator.requirements.general-10]:
前哨
s被稱為從可到達的一個迭代i,當且僅當存在的表達的應用程式的有限序列i,使i == s。如果s可從i,[i,s) 表示有效范圍。
和[iterator.requirements.general-12]:
將庫函式應用于無效范圍的結果是未定義的。
由于ranges::iota_view(1)不是有效范圍,因此對其應用views::reverse是未定義的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/397887.html
下一篇:編譯器看不到C 11識別符號
