std::ranges::sized_range, std::ranges::disable_sized_range
來自 cppreference.com
定義於標頭檔案 <ranges> |
||
template< class T > concept sized_range = ranges::range<T> && |
(1) | (C++20 起) |
template< class > constexpr bool disable_sized_range = false; |
(2) | (C++20 起) |
2)
disable_sized_range
存在的目的是允許使用提供 size
函式(作為成員或非成員)但實際上不符合 sized_range
模型的範圍型別。使用者可以為 cv-unqualified 的程式定義型別特化 disable_sized_range
。此類特化應可在 常量表達式 中使用,並具有型別 const bool。目錄 |
[edit] 語義要求
1) 給定型別為 std::remove_reference_t<T> 的左值
t
,T
建模 sized_range
僅當- ranges::size(t)
- 具有攤銷的常數時間複雜度,
- 不會以 等價保持 表示式可觀察的方式改變
t
的值,並且 - 等於 ranges::distance(ranges::begin(t), ranges::end(t)),並且
- 如果 ranges::iterator_t<T> 建模
forward_iterator
,則 ranges::size(t) 無論 ranges::begin(t) 的評估如何都應是定義良好的(換句話說,單趟大小範圍可能只在第一次呼叫 begin 之前支援 size,但前向範圍必須始終支援 size)。
[edit] 注意
disable_sized_range
不能用於選擇退出其迭代器和哨兵滿足 sized_sentinel_for
的範圍;必須改用 std::disable_sized_sentinel_for。
disable_sized_range
不能為陣列型別或引用型別進行特化。
[edit] 示例
執行此程式碼
#include <forward_list> #include <list> #include <ranges> static_assert ( std::ranges::sized_range<std::list<int>> and not std::ranges::sized_range<std::forward_list<int>> ); int main() {}
[edit] 參閱
(C++20) |
指定其迭代器型別滿足 random_access_iterator 的範圍(概念) |
(C++20) |
指定其迭代器型別滿足 contiguous_iterator 的範圍(概念) |