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

サンプルコードでほぼ正しいです。

auto の意味は C++11 で再定義されました。コンパイラは、使用されている変数の正しい型を推測します。

それを使用した構文は:、範囲ベースです。これは、ループがスレッド ベクトル内の各要素を解析することを意味します。

for 内では、変数auto&内のベクトル内の要素のコピーを作成しないようにするために、エイリアスを指定する必要があります。threadこのようにして、threadvar に対して行われるすべての操作は、threadsvector 内の要素に対して行われます。さらに、範囲ベースの for では、&パフォーマンス上の理由から常に参照を使用する必要があります。

于 2013-10-16T21:34:00.800 に答える