C++1z 初期化子リストからpairとtupleを構築しやすくするための改善

C++14では、以下のコードがコンパイルエラーになります。

std::tuple<int, int> pixel_coordinates() 
{
    return {10, -15};  // コンパイルエラー
}

struct NonCopyable { NonCopyable(int); NonCopyable(const NonCopyable&) = delete; };

std::pair<NonCopyable, double> pmd{42, 3.14};  // コンパイルエラー

C++1zではこれらが通るように、pairtupleのコンストラクタが、explicitと非explicitで適切にオーバーロードされるようになります。

explicitと非explicitでのオーバーロードにはSFINAEを使用しますが、規格書上のコンストラクタの定義にはenable_ifのような具体的な実装については出てこないため、EXPLICITと大文字で宣言が記述され、その定義の文章で「この場合はexplicit (、そうでなければ非explicit) となる」のような記述がされます。

例:

EXPLICIT constexpr pair(const T1& x, const T2& y);

注: …(略)… このコンストラクタは、is_convertible<const first_type&, first_type>::valuefalseもしくはis_convertible<const second_type&, second_type>::valuefalseである場合にのみexplicitとなる。

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。