我实际上是在Visual Studio 2017(Visual C ++ 14.15.26706)上使用C ++ 17中的lambda做一些测试。下面的代码可以正常工作。
#include <iostream>
int main()
{
bool const a_boolean { true };
int const an_integer { 42 };
double const a_real { 3.1415 };
auto lambda = [a_boolean, an_integer, a_real]() -> void
{
std::cout << "Boolean is " << std::boolalpha << a_boolean << "." << std::endl;
std::cout << "Integer is " << an_integer << "." << std::endl;
std::cout << "Real is " << a_real << "." << std::endl;
};
lambda();
return 0;
}
但是我的一个朋友使用现代MinGW在Qt Creator上进行了测试,我也这样做了,而且对于相同的代码,我们两个人都收到了两个警告,这非常宝贵。
warning: lambda capture 'a_boolean' is not required to be capture for this use. [-Wunused-lambda-capture]
warning: lambda capture 'an_integer' is not required to be capture for this use. [-Wunused-lambda-capture]
如果我从捕获区域中删除了a_boolean
和an_integer
,该代码仍然可以使用MinGW进行编译,甚至可以像Wandbox(GCC 9.0)那样使用-pedantic
和C ++ 17,但在Visual Studio 2017中不再可用。
C3493 'a_boolean' cannot be implicitly captured because no default capture mode has been specified.
C3493 'an_integer' cannot be implicitly captured because no default capture mode has been specified.
C2064 term does not evaluate to a function taking 0 arguments.
如果我从const
和an_integer
的声明中删除a_boolean
,则在所有平台上我都需要捕获它们,否则,它们中的任何一个都不会编译。
如果我删除a_real
,则MinGW和GCC都不高兴,也不想编译,甚至抱怨error: 'a_real' is not captured
,即使它是const
。
谢谢大家,祝大家有美好的一天。