25

次のコードは、MSVC2010 でコンパイルして実行できますか?

const std::string s = "foo";
std::string s2(std::move(s));

s の内部を使用する場合、誰もそれを使用しないことを知っておく必要があるため、const を削除してもかまわないので、これがおそらく何も壊さない理由がわかります。しかし、コンパイラが ROM (組み込みアプリケーション) で const オブジェクトを実装する場所についてはどうでしょうか? その場合、移動はコピーになりますか?または、MSVC がエラーを表示する必要がありますか?

4

2 に答える 2

30

私はstd::move(T const&)ただ返すと思いますT const &&。これは、実際には移動されないことを意味します (移動代入演算子/コンストラクターがパラメーターの型と一致しないため)。

何が起こるかというと、取るコンストラクターが(型指定された変数T const&) と一致するため、移動はコピーに劣化します。lvalueT const &&

于 2013-02-21T13:35:26.347 に答える
23

これは違いはありません

const std::string f() { return "foo"; }
std::string s2 = f();

これはかつて C++03 を推奨していましたが、委員会は右辺値参照を導入する際にこのコードを壊しませんでした。それは単にコピーに劣化します。

于 2013-02-21T13:37:27.127 に答える