name_check function補足

この項はかなり実装に拠った話しなので次バージョンで状況が変わることもある。あくまでもnativeの意味をはかるというコンテクストで読んでもらいたい。

細かく説明するとname_checkは基本的にファイル名のみのチェックをするものとして定義されている。具体例を挙げるなら、Windows処理系のドライブ名や"/", "\"などで絶対/相対パスがついているとアウトになってしまう。

が、native*1に関しては少し特別だ。実際にどういう風に働くのかDocumentationで調べてみると、

Guaranteed to return true for all names considered valid by the operating system

とか説明されていてちょとわかりづらい。のでソース直読みして何やってるのか解析してみると、boost::filesystem::path内のprivateメンバ関数m_path_append()*2で、nativeを指定されると、"/"によるディレクトリごとの切り分けと、それによって抽出したディレクトリ名がvalidな名前かどうかを判断している(Windowsでは"\"-->"/"の変換とドライブ名の認識も追加して行っているようだ。)。このとき実際に使用されるname_check functionは処理系がWindowsならwindows_name関数、それ以外なら無条件で真を返している(POSIXでnativeを使うと実質的にノーチェックな理由)。

というわけで大体処理系をまたいでパス処理を行う場合でなければnativeを指定しておけばいいようだ。

*1:no_checkも同様の扱いだがあまり使わないと思うので議論しない

*2:大体コンストラクタから呼び出される、名前どおりパス文字列をメンバ変数にappendする