为什么我不能使用带std :: thread的auto?

时间:2015-11-24 16:01:42

标签: c++ multithreading c++14 auto

我遇到std::thread的问题,因为它不接受使用自动指定参数的函数。以下是一些示例代码:

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

using namespace std;

void seev(const auto &v) // works fine with const vector<int> &v
{
    for (auto x : v)
        cout << x << ' ';
    cout << "\n\n";
}

int main()
{
    vector<int> v1 { 1, 2, 3, 4, 5 };
    thread t(seev, v1);
    t.join();
    return 0;
}

但是编译器说:

[Error] no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, std::vector<int>&)'

为什么会这样?这是语言或GCC(4.9.2)的问题吗?

2 个答案:

答案 0 :(得分:13)

auto视为模板参数,然后您的函数如下所示:

template <class T>
void seev (const T &v) ...

如果没有明确的类型规范,C ++就无法生成模板。这就是你得到错误的原因。要解决问题(使用模板参数声明),您可以使用:

thread t (seev<decltype(v1)>, std::ref(v1));

答案 1 :(得分:13)

void seev (const auto &v)

是无效的C ++(然而,它是针对C ++ 17提出的)。 gcc会告诉你有没有用-pedantic编译。