簡體   English   中英

C ++:const int *和cont int&之間的auto類型的不同推導

[英]C++ : Different deduction of type auto between const int * and cont int &

這是代碼示例。

a. int ii = 0;
b. const int ci = ii;
c. auto e = &ci; --> e is const int *
d. auto &f = 42; --> invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
e. const auto &g = 42 --> ok

觀察:
1.對於c)條款,自動推導出類型const
2.對於條款d),不會自動推導出類型const
3.對於子句e),必須手動添加const類型才能使其工作。

為什么類型const是自動推導出來的,而不是d?

原因不是常數,而是r值。

您不能對r值采用非const引用。

如果你想知道什么是r值,那么最初的想法只能在作業的右側。

要獲取編譯時常量的地址,編譯器首先將其復制,然后為您提供該地址。 要啟用該行為,引用必須顯式為const

完成答案:案例

  • C)的類型ciconst int ,從而類型&ci是地址const int
  • d) 42的類型是int auto推導為intf聲明為int的引用,但無法綁定到r值
  • e) g的類型是const int & ,它可以綁定到編譯時常量。

那是因為42的類型不是const int ,它是int 它是一個rvalue,這意味着它不能綁定到左值引用(除非它是對const的引用),但它仍然是int類型。 這就是auto

如果你用ci而不是42來試試它,你會發現它有效

auto &e = ci;

auto &f = 42;

42的類型為int因此auto &f變為int &f 現在42是編譯時文字,因此它是一個r值。 我們無法將r值綁定到引用,因此您會收到編譯器錯誤。 你用的時候

const auto &g = 42

g現在是一個const int &和一個const &可以綁定到一個臨時的並延長它的生命周期。

我認為你對發生的事情有一點混淆。 你的c並沒有試圖推斷出有關const任何內容。 ciconst int (int是const)。 &ci是一個const int * (指向int的非const指針,它是const)。 auto不能只是int *因為那樣你就會打破const契約。

正如其他人所提到的那樣,對於d,你試圖將非const引用綁定到rvalue(數字'42'不一定存在於內存中,因此你怎么能形成對它的引用...哪個在...您可以修改的未來?)。 對於e,編譯器現在願意將42放在內存中,因為你只是承諾你不會改變它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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