namespace std::ranges {
struct dangling {
constexpr dangling() noexcept = default;
template<class... Args>
constexpr dangling(Args&&...) noexcept { }
};
}
概要
dangling
は、イテレータまたはRangeがダングリングであることを示す型である。
この型のオブジェクトは、イテレータまたはRangeを返す関数において、それらがダングリングとなることがコンパイル時にわかる場合に、代わりに返されることがある。
dangling
自身はイテレータでもRangeでもないため、呼び出し側でそれらを期待したコードを書いていればコンパイルエラーとなる。その結果、ダングリングイテレータ/Rangeにアクセスするというエラーをコンパイル時に発見することができる。
メンバ関数
構築・破棄
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++20 |
例
#include <ranges>
#include <vector>
using namespace std;
vector<int> f(){ return {}; }
int main()
{
// borrowed_rangeではないRangeのrvalueが渡された場合、danglingが返る
auto result1 = ranges::find(f(), 42);
static_assert(same_as<decltype(result1), ranges::dangling>);
// lvalueが渡された場合、danglingにはならない
auto vec = f();
auto result2 = ranges::find(vec, 42);
static_assert(same_as<decltype(result2), vector<int>::iterator>);
// borrowed_rangeのrvalueが渡された場合、danglingにはならない
auto result3 = ranges::find(ranges::subrange{vec}, 42);
static_assert(same_as<decltype(result3), vector<int>::iterator>);
}
出力
バージョン
言語
- C++20
処理系
- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅