16

我知道 auto 意味着类型扣除。我从来没有见过它被用作auto&而且我不明白:这个短代码在做什么。

#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;
}

我猜这是某种合成糖,可以代替

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

但我不明白这个语法是如何工作的,以及那个 & 符号在那里做什么。

4

1 回答 1

29

您的示例代码几乎是正确的。

在 C++11 中重新定义了自动含义。编译器将推断出正在使用的变量的正确类型。

它的语法:是基于范围的。这意味着循环将解析线程向量中的每个元素。

在 for 内部,您需要指定别名auto&以避免在thread变量内的向量内创建元素的副本。这样,对 var 所做的每个操作都是在向量thread内的元素上完成的。此外,在基于范围的情况下,出于性能原因threads,您总是希望使用引用。&

于 2013-10-16T21:34:00.800 回答