6
私はどのように標準の支配この場合について少し困惑していますbar
(std::string xxx
を初期化する)?または、このコードは安全であり、の定義されていない動作はありませんか?のstd ::移動し、マップの割り当て
私はどのように標準の支配この場合について少し困惑していますbar
(std::string xxx
を初期化する)?または、このコードは安全であり、の定義されていない動作はありませんか?のstd ::移動し、マップの割り当て
地獄式は、はい、
(bar.operator[](baz)).operator=(std::move(baz))
と同等である。しかし(bar.operator[](baz)).operator=
の評価の間には順序が保証はありません - 正式に、呼び出される関数を指定する後置式 - との初期の評価は、 引数からoperator=
までです。これはbaz
から移動します。実際に
std::map<std::string, Foo> bar;
std::string baz = "some string";
bar[baz] = std::move(baz);
assert(bar.count("some string"));
ありがとう!これは私が自分自身と思ったもので、他人からの確認がほしいと思っています。 – GreenScape
それはUBではないのですが、どちらか、動作は保証されません。 –
[this](http://coliru.stacked-crooked.com/a/5ef8993192148d84)簡略化されたコードを参照してください。 'std :: map'と代入演算子は、これが発生するために関与する必要はなく、その存在はコードの根底にある問題を変更しません。 – Mankarse
@Mankarse、はい、確かに、すべてはこの場合に煮詰めることができます – GreenScape