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:
我一直认为空捕获不会捕获任何东西.
的确,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,lambda,language-lawyer,c17 来源: https://codeday.me/bug/20191007/1866151.html