- filesystem[meta header]
- std::filesystem[meta namespace]
- recursive_directory_iterator[meta class]
- function[meta id-type]
- cpp17[meta cpp]
void pop();
void pop(std::error_code& ec);そのディレクトリの走査を中断する。
*thisがデリファレンス可能であること。終端イテレータや、インクリメントによって無効化されたコピーはデリファレンス可能ではない。
depth() == 0の場合は、*thisに終端イテレータを代入する。そうでない場合は、そのディレクトリの走査を終了し、親ディレクトリに戻る。
*thisのそれまでのあらゆるコピーは、==のドメインにおいて間接参照であることが要求されなくなる
#include <iostream>
#include <filesystem>
#include <fstream>
namespace fs = std::filesystem;
int main()
{
fs::create_directory("dir");
std::ofstream{"dir/a.txt"};
fs::create_directory("dir/inner_dir");
std::ofstream{"dir/inner_dir/b.txt"};
fs::recursive_directory_iterator it{"dir"};
fs::recursive_directory_iterator last{};
for (; it != last; ++it) {
// エラーが発生したと想定し、inner_dirディレクトリの走査を中断する
if (it->path().filename() == "b.txt") {
it.pop(); // 親ディレクトリを指す (continueしてはいけない)
}
std::cout << it->path() << " : " << it.depth() << std::endl;
}
}- pop()[color ff0000]
- fs::create_directory[link /reference/filesystem/create_directory.md]
- it->path()[link /reference/filesystem/directory_entry/path.md]
- it.depth()[link depth.md]
"dir/inner_dir" : 0
"dir/a.txt" : 0
- C++17
- Clang: 7.0 [mark verified]
- GCC: 8.1 [mark verified]
- Visual C++:
- LWG Issue
recursive_directory_iterator::popmust invalidate - LWG Issue 2704.
recursive_directory_iterator's members should require '*thisis dereferenceable'- C++17の策定中に、
options/depth/recursion_pending/pop/disable_recursion_pendingは*thisがデリファレンス可能であることを要求する(そうでない場合は未定義動作)と規定された
- C++17の策定中に、
- LWG Issue 2706. Error reporting for
recursive_directory_iterator::pop()is under-specified- C++17の策定中に、
incrementと一貫したエラー報告のためpop(error_code&)オーバーロードが追加された
- C++17の策定中に、