這是一個判斷問題。我通常會讓std::swap
完成原型代碼的工作,但對於發佈代碼編寫自定義交換。我通常可以編寫一個自定義交換,大約是移動建築+2移動任務+ 1無用資源破壞的兩倍。然而,人們可能要等到std::swap
實際上證明是一個性能問題,然後再去打擾。
更新阿爾夫P. Steinbach的:
20.2.2 [utility.swap]指定std::swap(T&, T&)
具有noexcept
等效於:
template <class T>
void
swap(T& a, T& b) noexcept
(
is_nothrow_move_constructible<T>::value &&
is_nothrow_move_assignable<T>::value
);
即如果在T
上的移動操作是noexcept
,則std::swap
在T
上是noexcept
。
請注意,此規範不需要移動成員。它只需要來自rvalues的構造和分配,如果它是noexcept
,則交換將是noexcept
。例如:
class A
{
public:
A(const A&) noexcept;
A& operator=(const A&) noexcept;
};
std::swap<A>
即使沒有移動成員也沒有接受。
感謝您的更新,霍華德。我在猜測'A(const A&)noexcept;'是一個錯字,或者可能是吞嚥&符號?即你的意思是'A(A &&)noexcept;'(和分配操作者同樣)?乾杯, –
@Alf:不;他給出了一個例子,即使沒有實際的移動構造/賦值,std :: swap也會是「noexcept(true)」。 –
@丹尼斯:我想我需要更多的解釋,因爲對我來說,看起來像一個普通的(不移動)複製構造函數,和一個普通的複製賦值操作符,據我所知,它們與'is_nothrow_move_constructible'或' is_nothrow_move_assignable'? –