つまりどういう事だってばよ…

  • directory_all_range(fs::current_path())|oven::sorted で実行時に吹っ飛ぶ
  • oven::any_range を2回ループでイテレータが飛ぶ
  • boost::single_pass_traversal_tag があ や し い
  • any_range だと問題ない
  • any_range だと2回以上のループで死亡
  • forward_traversal_tag や single_pass_traversal_tag を調べたけど英語読めねー\(^o^)/
  • forward_traversal_tag が使えないか試行錯誤するが-boost::filesystem::directory_iterator は single_pass_traversal_tag を直で使ってるから無理くさい
  • single_pass_traversal_tag は直接イテレータを動かしてる???
  • directory_all_range(fs::current_path())|adaptors::filtered は問題なく動くみたいだからいっか!←いまここ

結論:よくわからん!!
最初は、oven::any_range が原因かと思ったけどどうやら directory_iterator が single_pass_traversal_tag を使ってるのが原因だったみたい。
原因は分かったけど filesystem の仕様の問題だから対策の使用がないな…。
そもそも filesystem 自体 range にそこまで対応してなさそうだし。
ちなみに再現ソースはこんな感じ。

int	array[] = {0, 1, 2, 3, 4, 5};

oven::any_range<int, boost::single_pass_traversal_tag> range;
range = boost::make_iterator_range(array);

for( auto it = range.begin() ; it != range.end() ; it++ ){
	std::cout << *it << std::endl;
}
// 何も表示されないよ!
// oven::any_range<int, boost::forward_traversal_tag> だと問題なく動く
for( auto it = range.begin() ; it != range.end() ; it++ ){
	std::cout << *it << std::endl;
}

// forward_traversal_tag にしたいけど single_pass_traversal_tag しか受け付けません…
fs::path p = fs::current_path();
oven::any_range<fs::path, boost::single_pass_traversal_tag> range;
range = directory_range(p);

他にも使えない adaptors はありそうだな…。