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の以下の階層の下に解説ページを用意する予定です。