[英]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
。
完成答案:案例
ci
是const int
,從而類型&ci
是地址const int
。 42
的類型是int
。 auto
推導為int
, f
聲明為int
的引用,但無法綁定到r值 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
任何內容。 ci
是const 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.