名稱空間
變體
操作

std::experimental::ranges::swap

來自 cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
實驗性
技術規範
檔案系統庫 (檔案系統 TS)
庫基礎 (庫基礎 TS)
庫基礎 2 (庫基礎 TS v2)
庫基礎 3 (庫基礎 TS v3)
並行性擴充套件 (並行性 TS)
並行性擴充套件 2 (並行性 TS v2)
併發性擴充套件 (併發性 TS)
併發擴充套件 2 (併發 TS v2)
概念 (概念 TS)
範圍 (範圍 TS)
反射 (反射 TS)
數學特殊函式 (特殊函式 TR)
實驗性非 TS
模式匹配
線性代數
std::execution
契約
2D 圖形
 
 
通用工具庫
實用元件
swap
函式物件
超程式設計和型別特徵
帶標籤的對和元組
                          
tag specifiers
                                      
                          
 
定義於標頭檔案 <experimental/ranges/utility>
namespace {

    constexpr /* 未指定 */ swap = /* 未指定 */;

}
(ranges TS)
(定製點物件)
呼叫簽名 (Call signature)
template< class T, class U >

    requires /* 見下文 */

void swap( T&& t, U&& u ) noexcept(/* 見下文 */);

交換 tu 引用的值。

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 宣告。
如果透過過載決議選擇的函式沒有交換 tu 引用的值,則程式非良構;不需要診斷。
2) 否則,(void)ranges::swap_ranges(t, u),如果 TU 是等大小的陣列型別的左值引用(但元素型別可能不同)並且 ranges::swap(*t, *u) 是一個有效的表示式。
3) 否則,如果 TU 都是某種型別 VV&,且 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)

[編輯] 示例

[編輯] 參閱

交換兩個物件的值
(函式模板) [編輯]