#include <vector>
#include <iostream>
#include <memory>
int main()
{
// create the vector
std::vector< std::unique_ptr<int> > v;
for (int i = 0; i < 5; ++ i)
{
std::unique_ptr<int> newItem(new int(i));
v.push_back(std::move(newItem));
}
std::cout<<"vector's size before the move = " << v.size() << std::endl;
// move one item
auto it = move(v[2]);
std::cout<<"moved element = " << *it << std::endl;
std::cout<<"vector's size after the move = " << v.size() << std::endl;
if (nullptr == v[2].get())
std::cout<<"it is nullptr" << std::endl;
}
上記の例では、ベクトルから1つの要素を移動していますが、ベクトルのサイズは変わりません。移動するベクトルの要素は何に含まれていますか?
移動後に移動した要素は何になりますか?その要素にアクセスするのは未定義の動作ですか?それはnullptrですか(この例ではnullが出力されます)。
を行くこの背後にある論理的根拠が移動要素が破壊可能な状態でなければならないということです。 –
+1。しかし、私は移動割り当てがスワップと同等ではないと言うことを敢えて言います。これは、予期せず長い時間の間に割り当てられたリソースを残す可能性があるためです。だから、ケース(3)は私が期待するものではありません。 – sellibitze
@sellobitze:いいえ、私は、それが正当なものと同じように一般的な慣行の例になることを意図していなかったため、もし起こった場合にそれに憤慨する権利はありません。 –