Lambda捕获的对std :: cout的本地引用而无需询问

时间:2018-11-21 15:24:40

标签: c++ lambda language-lawyer c++17

我迷失了方向吗?总是允许这样做吗?

#include <iostream>

int main()
{
    auto& os = std::cout;

    auto write = []()
    {
        os << "what\n";
    };

    write();
}

我正在使用:

  

Apple LLVM版本10.0.0(clang-1000.10.44.4)
  目标:x86_64-apple-darwin17.7.0

尽管在Coliru上也可以看到

live demo

我一直认为空捕获不会捕获任何东西。

实际上是MSDN says

  

一个空的捕获子句[],表示lambda表达式的主体在封闭范围内不访问任何变量。

进一步的研究表明,这实际上可以捕获const的东西(我也不知道,但是无论如何),但是os不是const(没有参考文献!尽管它是 不可变的...)。

当打开-Wextra并注意到Clang认为没有必要捕获&os(在我的真实代码中)时,我遇到了这个问题。删除它后,我错失了找到该构建的工作机会。

1 个答案:

答案 0 :(得分:22)

有一个开放的clang report涵盖了lambda表达式隐式捕获引用的情况,这不仅限于std::cout,还包括被发现引用常量表达式的引用变量。

有关更多参考,CWG上的后备缺陷报告为CWG-1472

编辑:

基于@ Rakete1111的评论,我应该明确指出clang正确地接受了代码, 这是应用上述CWG缺陷的结果。由于以下原因,该报告被重新打开 诊断位置不是因为他们对接受的理解是错误的