Какой тип находится в диапазоне для цикла? - PullRequest
18 голосов
/ 25 ноября 2011
#include <vector>
#include <iostream>

int main()
{
    std::vector< int > v = { 1, 2, 3 };
    for ( auto it : v )
    {
        std::cout<<it<<std::endl;
    }
}

На что расширяется auto?Это расширяется до int& или int?

Ответы [ 2 ]

18 голосов
/ 25 ноября 2011

Расширяется до int. Если вы хотите ссылку, вы можете использовать

for ( auto& it : v )
{
    std::cout<<it<<std::endl;
}

Согласно стандарту C ++ 11, auto считается спецификатором простого типа [7.1.6.2], таким образом, к нему применяются те же правила, что и к другим simple- типа спецификаторы . Это означает, что объявление ссылок с помощью auto ничем не отличается от всего остального.

5 голосов
/ 25 ноября 2011

Я создал еще один пример, который отвечает на вопрос:

#include <vector>
#include <iostream>

struct a
{
    a() { std::cout<<"constructor" << std::endl; }
    a(const a&) { std::cout<<"copy constructor" << std::endl; }
    a(a&&) { std::cout<<"move constructor" << std::endl; }

    operator int(){return 0;}
};

int main()
{
    std::vector< a > v = { a(), a(), a() };

    std::cout<<"loop start" << std::endl;
    for ( auto it : v )
    {
        std::cout<< static_cast<int>(it)<<std::endl;
    }
    std::cout<<"loop end" << std::endl;
}

Очевидно, что auto расширяется до int, и копия создается. Чтобы предотвратить копирование, цикл for должен иметь ссылку:

for ( auto & it : v )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...