簡體   English   中英

C ++中對右值的引用的分配和不變性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM