2016-08-19 3 views
1

Что случилось с этим утверждением:Что случилось с этим утверждением «авто ITER = первый»

auto iter = first; 

Почему iter++ может хорошо работать, как все мы знаем, first является const&,

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

Если я не хочу использовать auto, что мне делать, спасибо –

+1

Используйте 'const iteratorT &' или 'const auto &' вместо этого, если вы хотите, чтобы это была ссылка на const. – 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 является ссылкой на const, то как «iter ++» может работать хорошо, –

+0

@z_chong Вот почему я сказал - _Все их, если вы хотите, чтобы 'iter' был ссылкой на const, конечно. Похоже, это было вашим намерением от вопроса, кроме того, что он был бы сломан код, конечно. – skypjack