对不起,如果这个问题措辞不够好,但这是我能尽可能简明扼要地重述我的问题。
我所说的情况是:
#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搜索它,那就表现出一些怜悯先等。