namespace std {
template <std::size_t I, class T, std::size_t N>
T& get(array<T, N>& x) noexcept; // (1) C++11
template <std::size_t I, class T, std::size_t N>
constexpr T& get(array<T, N>& x) noexcept; // (1) C++14
template <std::size_t I, class T, std::size_t N>
T&& get(array<T, N>&& x) noexcept; // (2) C++11
template <std::size_t I, class T, std::size_t N>
T&& get(array<T, N>&& x) noexcept; // (2) C++14
template <std::size_t I, class T, std::size_t N>
const T& get(const array<T, N>& x) noexcept; // (3) C++11
template <std::size_t I, class T, std::size_t N>
constexpr const T& get(const array<T, N>& x) noexcept; // (3) C++14
template <std::size_t I, class T, std::size_t N>
constexpr const T&& get(const array<T, N>&& x) noexcept; // (4) C++17
}
概要
タプルと見なせる型から指定した位置の要素を取得する。
<array>
ヘッダでは、array
クラスに関するオーバーロードを定義する。
適格要件
I < N
であること
戻り値
x[I]
例外
投げない
計算量
定数時間
例
#include <cassert>
#include <array>
#include <utility>
const std::array<int, 3> make()
{
return {3, 1, 4};
}
int main()
{
// 非const左辺値参照版
{
std::array<int, 3> ar = {3, 1, 4};
int& front = std::get<0>(ar); // 先頭要素を取得する
int& back = std::get<2>(ar); // 最後尾要素を取得する
assert(front == 3);
assert(back == 4);
}
// 右辺値参照版
{
std::array<int, 3> ar = {3, 1, 4};
int front = std::get<0>(std::move(ar));
assert(front == 3);
}
// const左辺値参照版
{
const std::array<int, 3> ar = {3, 1, 4};
const int& front = std::get<0>(ar);
const int& back = std::get<2>(ar);
assert(front == 3);
assert(back == 4);
}
// const右辺値参照版
{
int front = std::get<0>(make());
assert(front == 3);
}
}
出力
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2008 (std::tr1) ✅, 2010 ✅, 2012 ✅
備考
GCC 4.7のstd::get()
は、I
の境界チェックがない。