首頁 > 後端開發 > C++ > 主體

在C 11中使用「auto」時,如何確定變數是引用還是值?

Susan Sarandon
發布: 2024-11-04 11:24:02
原創
1004 人瀏覽過

When using

C 11 “auto”型別推導:解析引用與值

在C 11 中,「auto」關鍵字提供了一種便捷的方法自動推斷變數的類型。但是,在使用“auto”時,必須了解確定其解析為值還是引用的規則。

「auto」的型別推導規則:

基本規則是「auto」解釋變數本身的聲明,而不是它代表的型別。因此,以下的範例清楚地表明「auto」解析為一個值:

<code class="cpp">auto i = v.begin(); // Copy, as begin() returns an iterator by value</code>
登入後複製

但是,在更複雜的場景中,差異可能不太明顯。考慮以下範例:

  • 情況 1:引用還是複製?
<code class="cpp">const std::shared_ptr<Foo>&amp; get_foo();
auto p = get_foo(); // Copy or reference?</code>
登入後複製

在這種情況下,「auto」從以下推導出類型get_foo() 函數的回傳類型,它是對 std::shared_ptr 的引用。由於 p 的聲明使用單一與號 (&),因此它解析為 副本 ,而不是引用。

  • 情況2:靜態變數- 複製或引用?
<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>
登入後複製

這裡,「auto」從以下推導出類型s_foo 的聲明,它是一個靜態std::shared_ptr。由於 sp 的聲明中沒有 & 符號,因此它再次解析為 copy.

  • 情況 3:循環容器 - 每次迭代都複製?
<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>
登入後複製

在這種情況下,「auto」推導出type 來自向量的迭代器類型。迭代器傳回 std::shared_ptr,它是引用型別。但是,由於 foo 的聲明使用了與號 (&),因此它解析為 解引用 值,該值是 std::shared_ptr 副本

結論:

「auto」類型推導的規則很簡單:它遵循變數本身的聲明。若要解析為引用,請在聲明中使用 & 符號 (auto &ref = ...)。否則,“auto”將推導出值類型。

以上是在C 11中使用「auto」時,如何確定變數是引用還是值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!