[英]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 無效:
沒有,因為既不
T
在template<class T> void f(const T&&)
是一個轉發參考,也不const auto&&
是。T&&
出現在參數聲明中的事實並不意味着它是轉發引用。 只有沒有像const
或volatile
限定符的純T&&
是轉發引用,這意味着它必須是template<class T> void f(T&&)
或auto&&
,並且永遠不要const T&&
或const auto&&
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.