我正在學習C 中的rvalue參考概念。我想了解下面的代碼是否會產生一個懸空的參考。
std::string&& s = std::move("test text")。
std::cout << s << std::endl;
根據我的理解,s應該是一個懸空的參考,因為它的賦值與std::move的回傳值系結。而正確的用法應該是 std::string&& s = "test text"。但是,當我在這里嘗試http://cpp.sh/時,程式實際運行并列印出 "測驗文本"。這是否意味著s實際上不是一個懸空的參考?
我發現一個類似的堆疊溢位問題這里:
int main()
{
string&& danger = std::move(middle_name()); //dangling reference!
return 0;
}
這證實了這將導致懸空參考。誰能給出一些提示?謝謝!
uj5u.com熱心網友回復:
不,它不會。
根據我的理解,s應該是一個懸空的參考,因為它的賦值與
的回傳值系結。std::move
你已經看了值的類別,但沒有看型別。
"test text"的型別是char const[10]。這個陣列駐留在 const 全域資料中。
然后你把它傳遞給move,它將回傳一個對該陣列的r值參考。這個移動運算式的回傳型別是char const(&&)[10],一個字符陣列的x值。
然后,這被分配到一個 由于參考被系結到一個物化的臨時,而這個臨時是一個pr值,所以參考的壽命擴展適用。
因此,最終你的代碼在功能上等同于: 如果你使用一個 在這種情況下,你有一個pr值,你發送給 在這種情況下,沒有從 這段代碼將是
這段代碼將是UB,就像你發布的例子一樣。 uj5u.com熱心網友回復: 不。程式運行并列印出 "測驗文本 "并不意味著該程式沒有懸空參考。即使在存在懸空參考的情況下,程式也有可能出現這種行為。
它證實了沒有這樣的事情,因為鏈接的問題是不同的。
在這個例子中不存在懸空參考。字串是一個指向 const char 陣列的 lvalue。該陣列具有靜態存盤時間,對該陣列的參考將在整個程式中保持有效。
標籤: 上一篇:在CSV檔案中使用Python將不同的資料型別轉換為數字 下一篇:回傳空白值的參考資料
std::string&&/code>。但這不是一個字串,而是一個字符陣列。然后必須構建一個std::string型別的pr值。它是通過呼叫建構式 std::string::string(char const*) 來完成的,因為在傳遞陣列的參考時,它將衰減為一個指標。
std::move是完全不相關的,在這種情況下完全沒有作用。
std::string&& s = std::string{"test text"/span>}。
std::cout << s << std::endl;
std::string字面,答案就會不同://`"test text "s`是一個`std::string`prvalue。
std::string&& s = std::move("test text"/span>s)。
std::cout << s << std::endl;
std::move,它回傳一個型別為std::string的x值,所以std::string&&。std::move回傳的xvalue中物化出臨時性,并且參考只是系結到std::move的結果。這里沒有應用任何擴展。程式實際運行并列印了 "測驗文本"。這是否意味著S實際上不是一個懸空的參考?
我在這里發現了一個類似的堆疊溢位問題:......它證實了這將導致懸空參考。
