std::experimental::ranges::swap
來自 cppreference.com
< cpp | experimental | ranges
定義於標頭檔案 <experimental/ranges/utility> |
||
namespace { constexpr /* 未指定 */ swap = /* 未指定 */; |
(ranges TS) (定製點物件) |
|
呼叫簽名 (Call signature) |
||
template< class T, class U > requires /* 見下文 */ |
||
交換 t 和 u 引用的值。
對 ranges::swap
的呼叫等價於
1) (void)swap(std::forward<T>(t), std::forward<U>(u)),如果該表示式有效,其中過載決議使用以下候選進行:
- template<class T> void swap(T&, T&) = delete;
- template<class T, std::size_t N> void swap(T(&)[N], T(&)[N]) = delete;
- 透過實參依賴查詢找到的任何
swap
宣告。
如果透過過載決議選擇的函式沒有交換 t 和 u 引用的值,則程式非良構;不需要診斷。
2) 否則,(void)ranges::swap_ranges(t, u),如果
T
和 U
是等大小的陣列型別的左值引用(但元素型別可能不同)並且 ranges::swap(*t, *u) 是一個有效的表示式。3) 否則,如果
T
和 U
都是某種型別 V
的 V&
,且 V
滿足 MoveConstructible<V> 和 Assignable<V&, V> 的語法要求,則交換引用的值,如同透過 V v{std::move(t)}; t = std::move(u); u = std::move(v);。如果任一概念的語義要求未滿足,則程式非良構;不需要診斷。4) 在所有其他情況下,對
ranges::swap
的呼叫非良構。ranges::swap 可以在常量表達式中使用,如果它呼叫的每個函式(如上所述)都可以這樣使用。
目錄 |
[編輯] 自定義點物件
名稱 ranges::swap
表示一個 *自定義點物件*,它是一個函式物件,屬於一個字面量Semiregular
類型別(為解釋目的,記作 SwapT
)。SwapT
的所有例項都相等。因此,ranges::swap
可以自由複製,並且其副本可以互換使用。
給定一組型別 Args...
,如果 std::declval<Args>()... 滿足上述 ranges::swap
的引數要求,則 SwapT
將滿足 ranges::Invocable<const SwapT, Args...>。否則,SwapT
的任何函式呼叫運算子都不參與過載決議。
在定義 ranges::swap
的每個翻譯單元中,它都指向自定義點物件的相同例項。(這意味著它可以在行內函數和函式模板等中自由使用,而不會違反單一定義規則。)
[編輯] 異常
1)
noexcept 規範:
其中 noexcept(noexcept((void)swap(std::forward<T>(t), std::forward<T>(u))))
swap
是如上所述找到的。2)
noexcept 規範:
noexcept(noexcept(ranges::swap(*t, *u)))
3)
noexcept 規範:
noexcept(std::is_nothrow_move_constructible<V>::value &&
std::is_nothrow_move_assignable<V>::value)
std::is_nothrow_move_assignable<V>::value)
[編輯] 示例
本節不完整 原因:無示例 |
[編輯] 參閱
交換兩個物件的值 (函式模板) |