c 11中 auto 定義的引用為什麼不能繫結字面值?

時間 2021-06-01 15:59:12

1樓:劉雲賓

編譯器認為,8 的型別是 int(因為非類非陣列的純右值沒有 CV 屬性),所以,它會推導為 int& ay = 8; 這顯然是錯誤的。

非類非陣列的純右值不能有cv 限定。(注意:函式呼叫或轉型表示式可能生成非類的 cv 限定型別的純右值,但其 cv 限定符被立即剝除。)

值類別 - cppreference.com

2樓:坑坑

Cannot bind a plain reference to a literal?

我英語不行,強行去stack overflow問了一下,看裡面的乙個回答的意思,應該是說auto不能判斷是不是const,這是這個型別說明符的定義。

順帶說一下,h並不是乙個const int &,h是乙個int 型別,嚴格的說&是屬於宣告符而不是在基本資料型別那一邊,const也同理不是乙個型別。我的理解應該沒錯,畢竟我也是菜鳥,這段話僅供參考

還有就是裡面乙個回答我沒看懂,有沒有人解決一下:

fact a const reference binds to it, doesn't mean it's of a const reference type.

乙個常量引用繫結了42,並不意味著這是乙個常量引用型別。

為什麼?這意思是const &i = 42中的i不一定是常量引用??感覺不對啊。。。使我英語太爛麼

3樓:

看到C++Primer第五版62頁,有類似疑惑,書中這樣寫的auto &h = 42錯誤:不能為非常量引用繫結字面值const auto &j = 42; //正確:可以為常量引用繫結字面值

我是這樣理解的:

兩處編譯器都把auto讀成int,而42是右值,引用不可以繫結右值,而常量引用可以繫結字面值。

4樓:譚耀程

編譯器推斷8的型別時是int,不知道為什麼。

------

const int a=3;

decltype(a) b=3;//必須初始化decltype(8) c;//可以不初始化

5樓:

非常量引用的初始值必須為左值。所以auto &ay = 8;//錯誤;

除此之外:

1.常量引用初始值可以為右值,所以const auto &ay=8;//正確

2.常量引用的初始值可以為左值,所以auto &ax = cx;//正確

6樓:黃真川

題主可以翻翻C++ Primer第五版,69頁裡有講Compound Types, const and auto。『字面值8不就是乙個不具名的const int型別變數麼』這個地方,有什麼可以佐證嗎?

Quora上有個類似的問題,題主可以看看Why is [code c++] auto &h = 42;[/code] illegal and [code c++]const auto &j = 42;[/code] legal in C++?

7樓:梁少聰

常量左值引用(const X&):可以繫結到 X、const X型別的左值物件,或X、const X型別的右值;[注 6]

所以問題是:

auto沒有推斷為const int &

沒有為什麼,auto就是這麼幹的。。。

參考:wiki

8樓:習習谷風

「Second, auto ordinarily ignores top-level consts」,C++ Primer, Page 69。

9樓:

cx在記憶體中會占用乙個記憶體位址,而字面量8不會。

左值引用必須要繫結到lvalue上

如何判斷乙個value是lvalue還是rvalue呢?

看兩點:

1,是否有名字

2,是否能取到它的位址

如果滿足任何一點,那就是lvalue

字面量不滿足,所以是rvalue,於是編譯不過補充一句,題主最後說字面量8是const lvalue所以可以被const lref繫結,這完全是扯犢子。請你先去看看標準定義,不要臆測

在C 11中,auto關鍵字的大量使用,會影響編譯速度嗎?

原子筆 沒有測試就別隨便下結論或者杞人憂天吧。編譯器在處理XX a b時,不管XX是auto還是非auto 一樣要去檢視b的型別的,並且需要確認可以拷貝構造。所以理論上來講只會減少編譯時間,包括非自定義型別也類似。 Premature optimization is the root of all ...

C 11中的move語義減少了臨時物件和物件複製嗎?

槓吐血評論員陶某 move應該是針對你的物件中有在堆上分配記憶體這種情況而設定的,你舉的例子恰好不符合這種情況。看下面這個例子 classA A A A other A operator A other return this int p int main A中有堆上分配的變數p時,呼叫move語義...

在C 11中,如何將一種編碼的string轉換為另一種編碼的string?

keyes vc下有個BSTR,很方便。string to wstring string str hello知乎 bstr tt str.c str wstring wstr t wstring to string wstring wstr L hello知乎 bstr t t wstr.c str...