2016-05-30 5 views
6

:wstringのためになぜboost :: filesystem :: path :: string()はWindowsでは値で返され、POSIXでは参照によって返されますか?ブースト/ファイルシステム/ path.hppから

# ifdef BOOST_WINDOWS_API 
    const std::string string() const 
    { 
     [...] 
    } 
# else // BOOST_POSIX_API 
    // string_type is std::string, so there is no conversion 
    const std::string& string() const { return m_pathname; } 
    [...] 
# endif 

()、それは正確に他の方法で回避され - Windows上で参照することによって、およびPOSIX上の値で返します。興味深い理由はありますか?

答えて

7

pathは、WindowsでUnicodeでエンコードされたパスを処理する唯一の方法がUTF-16であるため、wstringを格納します。他のプラットフォームでは、ファイルシステムはUTF-8(またはそれに近い)を介してUnicodeを処理するので、pathstringを格納します。

Windows以外のプラットフォームでは、path::stringは実際の内部データ構造体にconst参照を返します。 Windowsでは、std::stringを生成する必要があるため、コピーで返します。

C++にバインドされたFile System TSはこれを行いません。そこでは、path::stringは常にコピーを返します。ネイティブに格納された文字列型を使用する場合は、path::nativeを使用する必要があります。型はプラットフォームに依存します。

1

Windows APIの場合、変数 'm_pathname'を 'path_traits'によって実装されている別の形式(文字列)に変換する必要があるため、値によって戻ります。これは、余分なコピーがNRVOか暗黙の移動のいずれかによって省略されるが、もちろん参照で渡すことができない一時変数を導入する。

'm_pathname'の形式は既にネイティブ形式(文字列)であるため、変換する必要はなく、const参照として渡すことができます。

関連する問題