最終更新日時(UTC):
が更新

履歴 編集

function
<filesystem>

std::filesystem::path::コンストラクタ(C++17)

path() noexcept;                                      // (1)
path(const path& p);                                  // (2)
path(path&& p) noexcept;                              // (3)
path(string_type&& source, format fmt = auto_format); // (4)

template <class Source>
path(const Source& source, format fmt = auto_format); // (5)

template <class InputIterator>
path(InputIterator first, InputIterator last,
     format fmt = auto_format);                       // (6)

template <class Source>
path(const Source& source, const locale& loc,
     format fmt = auto_format);                       // (7)

template <class InputIterator>
path(InputIterator first, InputIterator last,
     const locale& loc, format fmt = auto_format);    // (8)

概要

  • (1) : デフォルトコンストラクタ
  • (2) : コピーコンストラクタ
  • (3) : ムーブコンストラクタ
  • (4) : 内部表現としての文字列オブジェクトを代入する
  • (5) : あらゆる文字型・文字コードの文字配列、文字列オブジェクトを代入する
  • (6) : あらゆる文字型・文字コードの文字範囲を代入する
  • (7) : ロケールを考慮して、あらゆる文字型・文字コードの文字配列、文字列オブジェクトを代入する
  • (8) : ロケールを考慮して、あらゆる文字型・文字コードの文字配列、文字列オブジェクトを代入する

要件

  • 文字型charwchar_tchar8_t, char16_tchar32_tEcharTとして、
  • (5), (7) : Source型は、以下の要件を満たすこと
    • std::basic_string<EcharT, traits, Allocator>
    • std::basic_string_view<EcharT, traits>
    • ECharT型を要素とする文字配列と、文字配列へのポインタ
    • これらの要件を満たさない場合、この関数はオーバーロード解決の候補から除外される
    • sourceはヌルポインタであってはならない
  • (6), (8) : InputIteratorが指す値型はEcharTであること
  • (7), (8) : 要素となる文字型がcharであること

効果

  • (1) : 空のパスを生成する
  • (2) : pの保持するパスを*thisにコピーする
  • (3) : pの保持するパスを*thisに移動する。このコンストラクタ呼び出しのあと、pは「有効だが未規定の状態」となる
  • (4) : 必要であればパスのフォーマットを変換し、source*thisに移動する。このコンストラクタ呼び出しのあと、sourceは「有効だが未規定の状態」となる
  • (5) : 必要であればパスのフォーマットを変換し、source*thisにコピーする
  • (6) : イテレータ範囲[first, last)をパス文字列とし、必要であればパスのフォーマットを変換て、そのコピーを*thisにコピーする
  • (7) :
    • pathクラスのvalue_typewchar_tであれば、std::codecvt<wchar_t, char, mbstate_t>ファセットを使用して、sourceをシステムのワイド文字コードに変換をする。そうでなければ、同ファセットを使用して、システムのマルチバイト文字コードに変換をする
    • さらに必要であればパスのフォーマットを変換し、その結果を*thisにコピーする
  • (8) :
    • pathクラスのvalue_typewchar_tであれば、std::codecvt<wchar_t, char, mbstate_t>ファセットを使用して、イテレータ範囲[first, last)のパス文字列をシステムのワイド文字コードに変換をする。そうでなければ、同ファセットを使用して、システムのマルチバイト文字コードに変換をする
    • さらに必要であればパスのフォーマットを変換し、その結果を*thisにコピーする

事後条件

備考

  • C++17までは、これらのコンストラクタにUTF-8エンコーディング(u8""リテラル等)でパス文字列を指定してはならない。そのような用途には、std::filesystem::u8path()関数を使用すること
    • C++20以降は、char8_t型として型によって文字のエンコーディングを判別できるようになったため、char8_t文字列によって表現されたUTF-8エンコーディングのパス文字列からの構築をサポートしている
  • (1) : このクラスはメンバ変数としてstring_type型のオブジェクトを持つ。std::basic_stringクラスのデフォルトのアロケータであるstd::allocatorクラスは、デフォルトコンストラクタで例外を送出しない。そのため、pathクラスのデフォルトコンストラクタもまた例外を決して送出しない

#include <cassert>
#include <filesystem>

namespace fs = std::filesystem;

int main()
{
  // (1)
  // デフォルト構築
  {
    fs::path p{};
    assert(p.empty());
  }

  // (2)
  // コピー構築
  {
    fs::path p = "a/b/c";
    fs::path q = p;
    assert(p == q);
  }

  // (3)
  // ムーブ構築
  {
    fs::path p = "a/b/c";
    fs::path q = std::move(p);
    assert(q.generic_string() == "a/b/c");
  }

  // (4)
  // 内部表現形式のbasic_stringで構築。
  // この文字列は、システムのファイルシステムが規定する文字コードを持つこと。
  // POSIXではstd::string、Windowsではstd::wstring
  // ここではPOSIX環境であるとしてstd::stringを使用する
  {
    std::string raw_path = "a/b/c";
    fs::path p = std::move(raw_path);
    assert(p.generic_string() == "a/b/c");
  }

  // (5)
  // 文字コード規定の文字配列、文字列オブジェクトから構築。
  // Windows環境では、この方法ではUTF-8文字列を代入してはならない
  // (std::filesystem::u8path()関数で変換したパスを代入すること)
  {
    fs::path p1 = "a/b/c";  // システムのマルチバイト文字コードの文字配列を代入
    fs::path p2 = L"a/b/c"; // システムのワイド文字コードの文字配列を代入
    fs::path p3 = u"a/b/c"; // UTF-16エンコーディングの文字配列を代入
    fs::path p4 = U"a/b/c"; // UTF-32エンコーディングの文字配列を代入

    std::string p5_base = "a/b/c";
    fs::path p5 = p5_base; // システムのマルチバイト文字コードのstringオブジェクトを代入

    std::wstring p6_base = L"a/b/c";
    fs::path p6 = p6_base; // システムのワイド文字コードのwstringオブジェクトを代入

    std::u16string p7_base = u"a/b/c";
    fs::path p7 = p7_base; // u16stringオブジェクトを代入

    std::u32string p8_base = U"a/b/c";
    fs::path p8 = p8_base; // u32stringオブジェクトを代入

    std::string_view p9_base = "a/b/c";
    fs::path p9 = p9_base; // システムのマルチバイト文字コードの文字列を参照するstring_viewオブジェクトを代入

    std::wstring_view p10_base = L"a/b/c";
    fs::path p10 = p10_base; // システムのワイド文字コードの文字列を参照するwstring_viewオブジェクトを代入

    std::u16string_view p11_base = u"a/b/c";
    fs::path p11 = p11_base; // UTF-16エンコーディングの文字列を参照するu16string_viewオブジェクトを代入

    std::u32string_view p12_base = U"a/b/c";
    fs::path p12 = p12_base; // UTF-32エンコーディングの文字列を参照するu32string_viewオブジェクトを代入

    // C++20以降
    std::u8string_view p13_base = u8"a/b/c";
    fs::path p13 = p13_base; // UTF-8エンコーディングの文字列を参照するu8string_viewオブジェクトを代入
  }

  // (6)
  // 文字範囲から構築
  {
    // システムのマルチバイト文字コードの文字範囲を代入
    std::string p1_base = "a/b/c";
    fs::path p1 {p1_base.begin(), p1_base.end()};

    const char* p2_base = "a/b/c";
    fs::path p2 {p2_base, p2_base + std::char_traits<char>::length(p2_base)};
  }
}

出力

バージョン

言語

  • C++17

処理系

関連項目