为什么我不能将 auto 与 std::thread 一起使用?
Why can't I use auto with std::thread?
我遇到了 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)问题?
考虑将 auto
作为模板参数,那么您的函数如下所示:
template <class T>
void seev (const T &v) ...
如果没有明确的类型规范,C++ 无法体现模板。这就是你得到错误的原因。要解决问题(使用模板参数声明),您可以使用:
thread t (seev<decltype(v1)>, std::ref(v1));
void seev (const auto &v)
不是有效的 C++(但是,建议用于 C++17)。如果你用 -pedantic
.
编译,gcc 会告诉你
我遇到了 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)问题?
考虑将 auto
作为模板参数,那么您的函数如下所示:
template <class T>
void seev (const T &v) ...
如果没有明确的类型规范,C++ 无法体现模板。这就是你得到错误的原因。要解决问题(使用模板参数声明),您可以使用:
thread t (seev<decltype(v1)>, std::ref(v1));
void seev (const auto &v)
不是有效的 C++(但是,建议用于 C++17)。如果你用 -pedantic
.