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ではこれらが通るように、pairとtupleのコンストラクタが、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>::valueがfalseもしくはis_convertible<const second_type&, second_type>::valueがfalseである場合にのみexplicitとなる。
参照
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。