目前 Visual Studio 2013 update 2 不支持完整的 C++11,其中一项功能是捕获 lambda 中的参数包。有没有一种简单的方法可以解决这个问题,或者我是否必须放弃 Visual Studio 并使用兼容的编译器(例如 mingw/g++)?
以下代码演示了我想到的一个简单用例:
template <typename ... Args>
std::thread init_threaded(SomeObject sample, Args && ... args)
{
auto func = [=]()
{
sample->init(args...);
};
return std::thread(func);
}
这在最新的 xcode (5.1.1) 和 Linux 下的最新版本的 g++ (使用 4.9.0) 中效果很好,但是在 Visual Studio 2013 update 2 中它给出了错误:
error C2536: 'init_threaded::<lambda_3a984affe0045c597607c0ec0a116b46>::init_threaded::<lambda_3a984affe0045c597607c0ec0a116b46>::<args_0>' : cannot specify explicit initializer for arrays
Edit:这个错误似乎只有当 init 函数中有不同类型时才会发生。以下示例无法编译。
#include <thread>
struct foo
{
void init(int arg1, std::string arg2) {}
};
template <typename ... Args>
std::thread init_threaded(foo *sample, Args && ... args)
{
auto func = [=]()
{
sample->init(args...);
};
return std::thread(func);
}
int main()
{
foo f;
auto t = init_threaded(&f, 1, "two");
t.join();
}
正如评论中所讨论的,这是一个 MSVC 编译器错误,并且有一个解决方法。错误票是here https://connect.microsoft.com/VisualStudio/feedback/details/888992/visual-studio-2013-parameter-packs-and-lambda-capture-bug以防其他人遇到这种情况并想知道状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)