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

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

#include <iostream>

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

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

    write();
}

我正在使用:

Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0

虽然也看到Coliru:

(live demo)

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

的确,MSDN says

An empty capture clause, [ ], indicates that the body of the lambda expression accesses no variables in the enclosing scope.

进一步的研究表明,这实际上可以捕获常量(我也不知道,但无论如何),但os不是const(没有引用!尽管它是不可变的……).

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

解决方法:

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

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

编辑:

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

上一篇:读取二进制文件的惯用C 17标准方法是什么?


下一篇:该代码是否无法在C 17中编译?