簡體   English   中英

`auto && e` 在基於范圍的 for 循環中做什么?

[英]What does `auto && e` do in range-based for-loops?

假設我在使用基於范圍的循環編程時的當前規則說

盡可能使用for(auto const &e :...)for(auto &e:...) for(auto a: ...)

我基於我自己的經驗和這個問題,例如。

但是,閱讀有關新后的環簡潔的我不知道,我不應該取代我&我與規則&& 正如這里所寫的這看起來像邁耶斯的通用參考

所以,我問自己,我的新規則是否應該是

盡可能使用for(auto const &&e :...)for(auto &&e:...) ...

或者這並不總是有效,因此應該是相當復雜的

檢查for(auto const &&e :...)for(auto &&e:...)是否可行,然后考慮for(auto const &e :...)for(auto &e:...) ,並且僅需要時不要使用引用。

Howard Hinnant在這里很好地解釋了何時以及是否應該在 for 循環中使用auto&&

這留下了x在什么的問題

auto &&x = ...expr...

實際上是。 它的處理就像有一個函數模板定義一樣

template <class U> void f(const U& u);

並且x的類型由與u [§7.1.6.4.(7)] 相同的規則推導出來。

這意味着它不是作為 RValue 參考處理,而是作為“通用/轉發參考”——“ 參考折疊規則”適用。

這也適用於

const auto &&x = ...expr...

如 §7.1.6.4.(7) 中的示例所述,至少對於const auto &x

但是,正如 PiotrS 在問題評論中所說,任何限定符都會使 URef-ness 無效:

沒有,因為既不Ttemplate<class T> void f(const T&&)是一個轉發參考,也不const auto&&是。 T&&出現在參數聲明中的事實並不意味着它是轉發引用。 只有沒有像constvolatile限定符的純T&&是轉發引用,這意味着它必須是template<class T> void f(T&&)auto&& ,並且永遠不要const T&&const auto&&

暫無
暫無

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

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