lambda捕获的std :: cout的本地引用,而不需要它

Lig*_*ica 33 c++ lambda language-lawyer c++17

我迷失了吗?这总是允许的吗?

#include <iostream>

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

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

    write();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用:

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

虽然也看到Coliru:

(现场演示)

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

的确,MSDN :

空捕获子句[]表示lambda表达式的主体不会访问封闭范围中的变量.

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

当我打开-Wextra并注意到Clang认为&os捕获(存在于我的真实代码中)是不必要的时候,我偶然发现了这一点.删除它我错开了发现构建工作.

Jan*_*ans 23

有一个开放的clang报告,涵盖了lambda表达式隐式捕获引用的情况,这不仅限于std::cout引用引用常量表达式的变量.

有关更多参考,CWG的背景缺陷报告是CWG-1472

编辑:

根据@ Rakete1111的评论,我应该明确指出clang接受代码是正确的,这是应用上述CWG缺陷的结果.该报告因诊断位置而重新开放,并非因为接受错误