reference back(); // (1) C++11
constexpr reference back(); // (1) C++17
const_reference back() const; // (2) C++11
constexpr const_reference back() const; // (2) C++14
概要
最後尾要素を参照する。
堅牢化された事前条件
- C++26 :
a.empty()がfalseであること(要素数Nが0でないこと)
戻り値
a.back()は末尾の要素への参照を返す。もし、aがconstだった場合には、末尾の要素へのconst参照を返す。a.back() は{ auto tmp = a.end(); --tmp; return *tmp; } と同じ結果になる。
備考
要素数が0の場合(N == 0の場合)、この関数を呼び出してはならない。
- C++11 : 長さ0の配列に対して呼び出したときの動作は未定義
- C++26 : 上記の特別な規定は削除され、他の要素アクセス関数と同様に、堅牢化された事前条件の違反として扱われる
例
#include <iostream>
#include <array>
int main()
{
std::array<int, 3> ar = {3, 1, 4};
const std::array<int, 3>& car = ar;
int& a = ar.back();
const int& b = car.back();
std::cout << a << std::endl;
std::cout << b << std::endl;
}
出力
4
4
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2008 (std::tr1) ✅, 2010 ✅, 2012 ✅
参照
- N3470 Constexpr Library Additions: containers, v2
- P0031R0 A Proposal to Add Constexpr Modifiers to
reverse_iterator,move_iterator,arrayand Range Access - LWG Issue 4276.
front()andback()are not hardened for zero-lengthstd::array- C++26で、[array.zero]の「長さ0の配列で
front()/back()を呼び出したときの動作は未定義」という特別規定が削除され、他の要素アクセス関数と同様に堅牢化された事前条件の対象となった
- C++26で、[array.zero]の「長さ0の配列で