2016-08-19 50 views
1

發生了什麼事,以這樣一句話:發生了什麼事,以這種說法 「自動ITER =第一」

auto iter = first; 

爲什麼iter++可以很好地工作,因爲我們都知道,firstconst&

template<typename iteratorT, typename valueT> 
iteratorT find(const iteratorT& first, const iteratorT& last,const valueT& value) 
{ 
    auto iter = first; 
    while(iter != last && *iter != value) iter++; 
    return iter; 
} 

爲什麼?

+1

類型推演:你得到first'的'非常拷貝。 – skypjack

+0

如果我不想使用汽車,我應該怎麼做,謝謝 –

+1

如果你想讓它成爲一個const引用,可以使用'const iteratorT&'或'const auto&'。 – skypjack

回答

5

這就是使用auto時的類型扣減的工作方式,在您獲得first副本的示例中,該副本的類型爲iteratorT

,您可以改用:

  • const iteratorT &iter = first
  • const auto &iter = first(或只是auto &
  • decltype(first) iter = first
  • decltype(auto) iter = first

所有這些,如果你想iter是一個常量參考課程。

感謝@songyuanyao和@LogicStuff對他們在評論中的建議。


也考慮下面的例子再現您的問題在一個更清潔的方式:

#include <type_traits> 

int main() { 
    int i = 42; 
    const int & j = i; 
    auto k = j; 

    static_assert(std::is_same<decltype(k), int>::value, "!"); 
    static_assert(not std::is_same<decltype(k), const int &>::value, "!"); 
} 
+0

如果iter是一個常量引用,那麼「iter ++」可以很好地工作, –

+0

@z_chong這就是爲什麼我說 - - 當然,如果你希望'iter'是一個const引用,它們都是._看起來你的意圖是從這個問題來看,除了它本來會破壞代碼的事實。 – skypjack