函式模板
<utility>

std::move_if_noexcept

template <class T>  typename conditional < is_nothrow_move_constructible<T>::value ||                         !is_copy_constructible<T>::value,                         T&&, const T& >::type move_if_noexcept(T& arg) noexcept;
如果無異常則移動
返回 arg右值引用,除非複製比移動能提供更好的 強異常保證

強保證 由操作保證在發生異常時使物件處於操作之前的狀態。這可以透過操作副本(因此在操作期間原始物件保持不變)或僅使用不丟擲異常的操作(在這種情況下,提供更高級別的保證:無異常保證)來實現。

一些操作可以透過移動或複製物件來實現,通常是為 右值 移動,為 左值 複製:當物件不再需要時(例如 右值),移動通常比複製更有效率。

該函式如果型別是 無異常可移動構造(即,其移動建構函式從不丟擲),則將引數型別選擇為 右值引用;否則,如果型別是 可複製構造,則選擇為 左值引用。如果型別兩者都不是,則函式返回一個 右值,該右值將為 僅移動 型別(即使它們可能丟擲)選擇。

該函式返回與 move(arg) 相同的值,但返回型別根據 T 的屬性轉換為 T&&const T&

引數

arg
一個物件。

返回值

如果 T無異常可移動構造T 不是 可複製構造,則指向 arg右值引用
否則為 左值引用
返回型別使用 conditional 在兩種型別之間選擇:T&&const T&

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// move_if_noexcept example
#include <utility>      // std::move_if_noexcept
#include <iostream>     // std::cout

// function with lvalue and rvalue reference overloads:
template <class T> void overloaded (T&  x) {std::cout << "[lvalue]\n";}
template <class T> void overloaded (T&& x) {std::cout << "[rvalue]\n";}

struct A {   // copyable + moveable (noexcept)
  A() noexcept {}
  A (const A&) noexcept {}
  A (A&&) noexcept {}
};

struct B {   // copyable + moveable (no noexcept)
  B() {}
  B (const B&) {}
  B (B&&) {}
};

struct C {   // moveable only (no noexcept)
  C() {}
  C (C&&) {}
};

int main () {
  std::cout << "A: "; overloaded (std::move_if_noexcept(A()));
  std::cout << "B: "; overloaded (std::move_if_noexcept(B()));
  std::cout << "C: "; overloaded (std::move_if_noexcept(C()));
  return 0;
}

輸出
A: [rvalue]
B: [lvalue]
C: [rvalue]


資料競爭

呼叫此函式不會引入資料競爭。
儘管請注意,將返回值傳遞給實現 移動語義 的函式通常涉及修改物件的值或有效性。

異常

無異常保證:此函式從不丟擲異常。

另見