为什么在`thread`向量中`emplace`时,在线程参数中有一个引用类型会导致编译错误?

时间:2015-05-22 03:26:02

标签: c++ c++11 vector

对不起,如果这个问题措辞不够好,但这是我能尽可能简明扼要地重述我的问题。

我所说的情况是:

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

using namespace std;

void do_work(vector<string> &foo)
{
    foo.emplace_back("hi");
    cout << "hi" << endl;
}

int main()
{
    vector<thread> threads;
    vector<string> ds;

    for (int i = 0; i < 10; ++i)
        threads.emplace_back(do_work, ds);

    for (auto it = threads.begin(); it != threads.end(); ++it)
        it->join();
}

do_work是所有线程的入口点,它接受对vector<string>对象的引用,并在末尾创建一个新的字符串对象。如果我创建其中10个并且已传递给工作线程的所有vector<string>对象都是同一个对象,那么最后,我应该在向量中获得10个“hi”字符串。但是,代码似乎不在g++中编译。它会抱怨type中缺少一些名为thread的类型,但基本上使用引用类型作为参数必须打破一两个模板。为了避免这个问题,我可以修改do_work函数来显式接受指向vector对象的指针,或者我可以创建另一个驻留在函数作用域之外的向量对象,这样所有例程都可以访问该对象(它会变得凌乱)。这是一个例子。

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

using namespace std;

vector<string> foo;

void do_work()
{
    foo.emplace_back("hi");
    cout << "hi" << endl;
}

int main()
{
    vector<thread> threads;

    for (int i = 0; i < 10; ++i)
        threads.emplace_back(do_work);

    for (auto it = threads.begin(); it != threads.end(); ++it)
        it->join();
}

所以我的问题是为什么c ++不允许这样的类型声明? g++编译器显然“不支持”这种直观和逻辑的功能似乎是随意的。

P.S。是的,我已经搜索谷歌的答案,但我可能错过了一个描述这种现象的特定关键词,我不知道,所以如果你认为这是一个非常基本的概念并且我应该用Google搜索它,那就表现出一些怜悯先等。

0 个答案:

没有答案