このプログラムは、関数の外に列を移動し、別の文字列の構築のためにそれを使用しよう:std :: ::関数からオブジェクトを移動することは可能ですか? (C++ 11)
#include <iostream>
#include <string>
#include <utility>
std::string && Get_String(void);
int main(){
std::string str{Get_String()};
std::cout << str << std::endl;
return 0;
}
std::string && Get_String(void){
std::string str{"hello world"};
return std::move(str);
}
プログラムはコンパイルが、実行時にセグメンテーション違反します。
これは私の理論的根拠です:Get_String
は、ローカル文字列を作成します。ストリングがスコープ外に出る前に、ストリングのコピーを作成して返す必要があります。そのコピーはメインの文字列を構成するために使用されます。しかし、関数から文字列を移動した場合は、コピーを作成する必要はありません。
移動セマンティクスを理解しようとすると、誰かが私がやっていることがなぜ理にかなった理由を説明することができますか?関数からオブジェクトを移動することは可能ですか?
EDIT:
std::string && Get_String(void);
std::string Get_String(void);
に、まだ文字列を移動する方が効率的です:それはコンパイルし、私から関数のシグネチャを変更した場合、正しく動作します
この場合の返品期間中ですか?この例で考えると
RVOは、その問題を解決します。 'std :: move'を使って無効にしないでください。 – chris
@chris私は値を返すべきです。そして、コンパイラは私がやっていることに最適化しますか? –
はい、現代のコンパイラはコピーを削除する必要があります。 – chris