2016-11-22 18 views
2

boost::filesystem::pathsee demo、パス文字列中に引用符をエスケープする&を使用しています。boost :: filesystem :: pathとstd :: filesystem :: pathのパスエスケープ文字が異なるのはなぜですか?

std::cout << boost::filesystem::path("/R&D/Project \"boost\"") << std::endl; 

プリント"/R&&D/Project &"boost&""。ただし、std::filesystem::pathの場合I see thisの場合:

パスpでストリーム入力または出力を実行します。 std :: quotedは、後でストリーム入力演算子で読み取るときにスペースが切り捨てられないように使用されます。ここで

std::quotedからです:

脱出 - 私はstd::filesystem::path\代わりの&を使用することを伝えることができるエスケープ文字として使用する文字、デフォルトでこのことから

を\します。

これは間違いありませんか?はいの場合、委員会がこの行動を変更することを決めたのはなぜですか?

ボーナス質問:std::filesystem::pathの実装はありますか?最新のGCCとclangのどれもが<filesystem>ヘッダを提供していないようです。

答えて

1

もしそうなら、委員会はこの行動を変更することを決めたのはなぜですか?

ブーストインサータ出力抽出によってそのように認識されている引用符で囲まれた文字列、:強調N3399から

は、私のものです。 ファイルシステムスタディグループには、引用符付きおよび/またはエスケープされた文字列マニピュレータを文字列拡張子として指定すると、パス固有の機能よりも優れた解決策になるという意見があります。提案書N3431、引用符付き文字列ライブラリの提案を参照してください。 STDのいずれかの実装があります::ファイルシステム::利用できるパス:、ファイルシステムの研究会を言っ

は、それがpath

ボーナスの質問には、特定の機能よりも、quoted文字列マニピュレータを使用する方が良いと思いますか?最新のGCCとclangがヘッダを提供していないようです。

私の知る限り、g ++のような主要なコンパイラ、打ち鳴らすには、両方の名前空間std::experimental::filesystem<experimental/filesystem>で実験的な機能としてfilesystemを提供MSVC。 gccにはバージョン5があります。3あなたがhereを見ることができるように、MSVCはVS2012(それはVS2012とVS2013で<filesystem>だし、VS2015で<experimental/filesystem><filesystem>に移動)

+0

グレート、からの引用のためのおかげでそれを持っています!実験的には、成功していないオンラインコンパイラで試してみました。http://melpon.org/wandbox/permlink/nfZ88PnrttOGbEHuオンラインコンパイラの単なる問題かもしれません。 – Mikhail

+1

@Mikhail Jonathanが[この回答](http://stackoverflow.com/a/33159746/4115625)で述べたように、あなたは '-lstdC++ fs'とリンクする必要があります。[this](http:// melpon .org/wandbox/permlink/75pJtT4K3dAgGT1i) – Danh

+0

クール、ありがとう! – Mikhail

1

Boost :: Filesystemはかなり古く、C++ 14のquotedよりも前です。標準が内部的に一貫していることは全く合理的です。 Boostに続くのは二次的な懸念だけです。

関連する問題