該程序試圖移動串出的函數,並且將其用於另一個字符串的結構:是否有可能將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
將創建一個本地字符串。該字符串的副本需要在字符串超出範圍之前進行並返回。該副本將用於在main中構造字符串。但是,如果我將該字符串移出該函數,則不需要進行復制。
爲了理解移動語義,有人可以解釋爲什麼我在做什麼,可能沒有意義。是否可以將對象移出某個函數?
編輯:
它編譯並運行正常,如果我更改從函數簽名:
std::string && Get_String(void);
到
std::string Get_String(void);
是不是更有效地移動串在這種情況下返回?
RVO解決了這個問題。不要使用'std :: move'來禁用它。 – chris
@chris我應該返回值,編譯器會優化到我在做什麼呢? –
是的,任何現代編譯器都應該刪除該副本。 – chris