【发布时间】:2017-03-30 13:40:22
【问题描述】:
我在使用 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;
});
请注意 controlValue 变量未被 lambda 表达式捕获。
此外,在 lambda 表达式的 cppreference 中,声明 [] - captures nothing
使用 VS2015 编译上述代码会出现错误,这并不奇怪:
error C3493: 'controlValue' cannot be implicitly captured because no default capture mode has been specified
但是,当将 MinGW 与 gcc 4.8.2 一起使用时,相同的示例可以编译并运行。 一些在线编译器,包括 gcc 5.4.0、clang 3.8.0 给出了类似的结果。
当controlValue 丢失其const 时,所有经过测试的编译器都会给出所有预期的错误(变量未被捕获,这很好)。
在这种情况下,哪些编译器符合标准? 这是否意味着这里对 const 变量使用了一些优化或其他“技巧”?也许某些东西被隐含地捕获了? 谁能解释一下这里发生的情况?
编辑:
有人指出这个问题与Lambda capturing constexpr object 重复。虽然答案可能有些相关(指向 odr 用例),但问题是在通过 ref 捕获时发生错误。这里的主题完全不同,重点是根本不显式捕获变量(尽管在 lambda 主体中使用它)。
查看更多与 lambda 相关的问题后,如果有人感兴趣,我会指出 Using lambda captured constexpr value as an array dimension
(与 @Barry 所述相同)暗示 VS2015 错误,并显示此处示例中的 controlValue 变量设置为 @987654333 @修复VS2015下的编译问题。
【问题讨论】:
-
请注意,
controlValue是一个constexpr值。 -
为什么这里被认为是
constexpr?你能多解释一下或者给我一些文档吗?我相信constexpr在某些情况下可以被认为是const,但反过来则不然 -
@Dusteh:在这种特殊情况下,您甚至可以使用
const int controlValue = 5; std::array<int, controlValue> a; -
看看this answer。
标签: c++ c++11 lambda language-lawyer