次のコードがあるとします。
_#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> First{"example", "second" , "C++" , "Hello world" };
std::vector<std::string> Second{"Hello"};
First.swap(Second);
for(auto a : Second) std::cout << a << "\n";
return 0;
}
_
ベクトルが_std::string
_ではなく、クラスであると想像してください。
_std::vector<Widget> WidgetVector;
std::vector<Widget2> Widget2Vector;
_
_std::vector::swap
_メソッド:WidgetVector.swap(Widget2Vector);
で2つのベクトルを交換しても安全ですか、それともUBにつながりますか?
using std::swap; swap(a, b);
とa.swap(b);
は、後者が機能する場合とまったく同じセマンティクスを持っています。少なくともどんな正気なタイプでも。その点で、すべての標準タイプは正気です。
興味深いアロケーターを使用しない限り(ステートフル、常に等しいわけではなく、コンテナースワップで伝達されないことを意味します。 _std::allocator_traits
_ を参照)、2つのスワッピング _std::vector
_ を参照してください■同じテンプレート引数を持つsは、3つの値(容量、サイズ、およびデータポインタ)の退屈な交換にすぎません。そして、基本的な型を交換すること、データ競合がないことは安全であり、投げることはできません。
それは規格によっても保証されています。 std::vector::swap()
を参照してください。