template<random_access_range R = D>
requires sized_range<R>
constexpr decltype(auto) at(range_difference_t<R> n); // (1) C++29
template<random_access_range R = const D>
requires sized_range<R>
constexpr decltype(auto) at(range_difference_t<R> n) const; // (2) C++29
概要
範囲チェックをともなって、Rangeの要素にアクセスする。
範囲チェックがないoperator[]と異なり、範囲外のインデックスを指定した場合は例外を送出する。
テンプレートパラメータ制約
view_interface<D>に対して、
- (1) :
Dがrandom_access_rangeかつsized_rangeであること - (2) :
const Dがrandom_access_rangeかつsized_rangeであること
戻り値
(1), (2)ともに(*this)[n]
例外
n < 0もしくはn >= ranges::distance(derived())である場合、std::out_of_rangeを送出する。
備考
- この関数は、例外を送出しうるため、フリースタンディング処理系では削除される(フリースタンディング処理系では使用できない)
例
#include <iostream>
#include <ranges>
#include <stdexcept>
#include <vector>
int main()
{
std::vector<int> v = {1, 2, 3};
auto sub = std::ranges::subrange{v.begin(), v.end()};
std::cout << sub.at(1) << std::endl;
// 範囲外のインデックスを指定すると例外が送出される
try {
sub.at(3);
}
catch (const std::out_of_range&) {
std::cout << "out_of_range" << std::endl;
}
}
出力
2
out_of_range
バージョン
言語
- C++29
処理系
- Clang: 24 ✅
- GCC: 17 ✅
- Visual C++: 2026 Update 6 ❌
関連項目
参照
- P3052R2
view_interface::at()- C++29で、このメンバ関数が追加された。
std::spanやstd::basic_string_viewがat()を持つのに対し、<ranges>のビューには範囲チェック付きの要素アクセスがなかったため
- C++29で、このメンバ関数が追加された。