namespace std {
template <class... UTypes>
tuple(UTypes...) -> tuple<UTypes...>; // (1)
template <class T1, class T2>
tuple(pair<T1, T2>) -> tuple<T1, T2>; // (2)
template <class Alloc, class... UTypes>
tuple(allocator_arg_t, Alloc, UTypes...)
-> tuple<UTypes...>; // (3)
template <class Alloc, class T1, class T2>
tuple(allocator_arg_t, Alloc, pair<T1, T2>)
-> tuple<T1, T2>; // (4)
template <class Alloc, class... UTypes>
tuple(allocator_arg_t, Alloc, tuple<UTypes...>)
-> tuple<UTypes...>; // (5)
}
概要
std::tuple
クラステンプレートの型推論補助。
- (1) : 任意の型のオブジェクトを任意個受け取る場合の推論補助
- (2) :
std::pair
を受け取る場合の推論補助 - (3) : アロケータ付きで、任意の型のオブジェクトを任意個受け取る場合の推論補助
- (4) : アロケータ付きで、
std::pair
を受け取る場合の推論補助 - (5) : アロケータ付きで、
std::tuple
を受け取る場合の推論補助
備考
- (1) : パラメータの型が
const UTypes&...
やUTypes&&...
ではなくコピーで受け取るようにしているため、配列からポインタへの変換、関数から関数ポインタへの変換が起こる - (1) :
std::make_tuple()
関数と違って、std::reference_wrapper<T>
をT&
に展開はしない
例
#include <tuple>
#include <type_traits>
int main()
{
// (1)
// 任意個のオブジェクトからのタプルの構築
std::tuple t1 {3, "Hello", 1.23};
static_assert(std::is_same_v<
decltype(t1),
std::tuple<int, const char*, double>
>);
// (2)
// 組からのタプルの構築
std::tuple t2 = std::pair{3, "Hello"};
static_assert(std::is_same_v<
decltype(t2),
std::tuple<int, const char*>
>);
}
出力
バージョン
言語
- C++17
処理系
- Clang:
- GCC: 7.1.0
- Visual C++: ??