我在使用lambdas时遇到了一个有趣的案例(至少对我来说),并且想知道它是编译器错误还是标准功能允许的东西.
让我们切入追逐.有示例代码:
const int controlValue = 5;
std::vector<int> vect{ 0, 1, 2, 3 };
const auto result = std::any_of(vect.begin(), vect.end(), [](const int& item)
{
return item == controlValue;
});
Run Code Online (Sandbox Code Playgroud)
请注意,controlValuelambda表达式不捕获变量.另外,在lambda表达式的cppreference中说明了这一点[] - captures nothing
使用VS2015编译上面的代码会产生一个错误,这并不奇怪:
error C3493: 'controlValue' cannot be implicitly captured because no default capture mode has been specified
Run Code Online (Sandbox Code Playgroud)
但是,当使用MinGW与gcc 4.8.2相同的例子编译和工作.一些在线编译器包括gcc 5.4.0,clang 3.8.0给出了类似的结果.
当controlValue失去它const然后所有测试的编译器给出所有期望的错误(没有捕获变量,这是好的).
在这种情况下,哪些编译器符合标准?这是否意味着某些优化或其他"黑客"在这里用于const变量?也许某些内容是隐含的?谁能解释一下这里发生的情况?
编辑:
有人指出这个问题是Lambda捕获constexpr对象 的重复.虽然答案可能有些相关(指向odr用例),但是有关在通过ref捕获时发生错误的问题.这里的主题是完全不同的,并且侧重于根本不捕获显式变量(尽管在lambda体中使用它).
在查看了更多与lambda相关的问题之后,如果有人感兴趣,我会指出使用lambda捕获的constexpr值作为数组维度 …