このプログラムは、関数から文字列を移動し、それを別の文字列の作成に使用しようとします。
#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);
}
プログラムはコンパイルされますが、実行時にsegfaultが発生します。
これが私の理論的根拠でした: Get_String
ローカル文字列を作成します。文字列がスコープ外になる前に、その文字列のコピーを作成して返す必要があります。そのコピーは、mainで文字列を作成するために使用されます。ただし、文字列を関数の外に移動した場合は、コピーを作成する必要はありません。
移動のセマンティクスを理解するために、誰かが私が行っていることがおそらく意味をなさない理由を説明できますか?関数の外にオブジェクトを移動することは可能ですか?
編集:
関数のシグネチャを次のように変更すると、正しくコンパイルされて実行されます。
std::string && Get_String(void);
に
std::string Get_String(void);
この場合、リターン中に文字列を移動する方がさらに効率的ですか?