[英]Allocation and immutability of references to rvalues in C++
我正在努力掌握C ++中的右值。 具體來說,我不了解它們的分配位置以及為什么它們必須是不可變的。 假設我有以下代碼:
std::string str = std::string();
const std::string& sref = std::string();
第一行在堆棧中創建一個對象。 對象str
是一個可變對象,我可以使用它做任何我想做的事情。 據我所知,賦值右邊的表達式是rvalue,而str
是lvalue。
第二行在當前函數堆棧中創建一個對象(我認為是),並返回對該對象的const引用。 這樣創建的對象是不可變的。 同樣,賦值的右側是右值,但是這次我得到了右值的引用。 對右值的所有引用都必須是const,因為根據C ++標准,您不能更改右值。 第一個問題在當前函數堆棧中sref
分配在哪里? 為什么它必須是不變的? 我真的不明白為什么如果對象在堆棧中,我不能僅僅修改它。
如果一個對象是不可變的,那么僅擁有一個實例是有意義的,然后在應用程序中進行所有引用以指向該對象。
const std::string& ref_1 = std::string();
const std::string& ref_2 = std::string();
這兩個引用在C ++中是否指向同一對象?
分配它們的位置無關緊要。 在計算機內存中的某個位置,如果對其進行了優化,則可能根本不存在。 不用擔心
它們不是一成不變的 ,您可以根據需要進行修改(嘗試std::string().append('!')
); 只是如果它是對const
的引用,則只允許將臨時綁定到引用 。 而且,如果您不將其綁定到引用,則以后實際上無法命名它以對其進行任何操作。
此限制旨在防止程序員出錯 ,因為盡管Visual Studio放寬了該限制,但修改臨時文件通常是沒有意義的。 但是, 您仍然可以通過使用右值引用來使用不帶const
的此生存期擴展 :
std::string&& ref = std::string();
ref.append('!');
std::cout << ref << '\n';
你為什么要這么做? 誰知道。
至於最后一個問題(下次請每個問題一個問題),不,那兩個引用引用兩個不相關的臨時std::string
對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.