小编Dus*_*teh的帖子

Lambda表达式与空捕获

我在使用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)

但是,当使用MinGWgcc 4.8.2相同的例子编译和工作.一些在线编译器包括gcc 5.4.0,clang 3.8.0给出了类似的结果.

controlValue失去它const然后所有测试的编译器给出所有期望的错误(没有捕获变量,这是好的).

在这种情况下,哪些编译器符合标准?这是否意味着某些优化或其他"黑客"在这里用于const变量?也许某些内容是隐含的?谁能解释一下这里发生的情况?

编辑:

有人指出这个问题是Lambda捕获constexpr对象 的重复.虽然答案可能有些相关(指向odr用例),但是有关在通过ref捕获时发生错误的问题.这里的主题是完全不同的,并且侧重于根本不捕获显式变量(尽管在lambda体中使用它).

在查看了更多与lambda相关的问题之后,如果有人感兴趣,我会指出使用lambda捕获的constexpr值作为数组维度 …

c++ lambda language-lawyer c++11

16
推荐指数
1
解决办法
1638
查看次数

标签 统计

c++ ×1

c++11 ×1

lambda ×1

language-lawyer ×1