2016-01-22 10 views
6

私はどのように標準の支配この場合について少し困惑していますbarstd::string xxxを初期化する)?または、このコードは安全であり、の定義されていない動作はありませんか?のstd ::移動し、マップの割り当て

+1

それはUBではないのですが、どちらか、動作は保証されません。 –

+0

[this](http://coliru.stacked-crooked.com/a/5ef8993192148d84)簡略化されたコードを参照してください。 'std :: map'と代入演算子は、これが発生するために関与する必要はなく、その存在はコードの根底にある問題を変更しません。 – Mankarse

+0

@Mankarse、はい、確かに、すべてはこの場合に煮詰めることができます – GreenScape

答えて

11

地獄式は、はい、

(bar.operator[](baz)).operator=(std::move(baz)) 

と同等である。しかし(bar.operator[](baz)).operator=の評価の間には順序が保証はありません - 正式に、呼び出される関数を指定する後置式 - との初期の評価は、 引数からoperator=までです。これはbazから移動します。実際に

this asserts on GCC

std::map<std::string, Foo> bar; 
std::string baz = "some string"; 
bar[baz] = std::move(baz); 
assert(bar.count("some string")); 
+1

ありがとう!これは私が自分自身と思ったもので、他人からの確認がほしいと思っています。 – GreenScape

関連する問題