C++ Syntax – Meaning of auto&

c++syntax

I understand that auto means type deduction. I've never seen it used as auto& and furthermore I don't understand what : is doing in this short code.

#include <iostream>
#include <vector>
#include <thread>

void PrintMe() {
    std::cout << "Hello from thread: " << std::this_thread::get_id() << std::endl;
}

int main() {
    std::vector<std::thread> threads;
    for(unsigned int i = 0; i < 5; i++) {
        threads.push_back(std::thread(PrintMe));
    }

    for(auto& thread : threads) {
        thread.join();
    }

    return 0;
}

I can guess this is some sort of syntatic sugar that replaces

for(std::vector<std::thread>::iterator it = threads.begin(); it != threads.end(); it++ ) {
    (*it).join();
}

but I don't understand how this syntax works and what that & sign is doing there.

Best Answer

You are almost correct with your sample code.

Auto meaning was redefined in C++11. The compiler will inferer the right type of the variable that is being used.

The syntax with : it's a range based for. It means that loop will parse each element inside threads vector.

Inside the for, you need to specify the alias auto& in order to avoid creating a copy of the elements inside the vector within the thread variable. In this way every operation done on the thread var is done on the element inside the threads vector. Moreover, in a range-based for, you always want to use a reference & for performance reasons.

Related Question