我迷失了方向吗?总是允许这样做吗?
#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上也可以看到
我一直认为空捕获不会捕获任何东西。
实际上是MSDN says:
一个空的捕获子句[],表示lambda表达式的主体在封闭范围内不访问任何变量。
进一步的研究表明,这实际上可以捕获const
的东西(我也不知道,但是无论如何),但是os
不是const
(没有参考文献!尽管它是 不可变的...)。
当打开-Wextra
并注意到Clang认为没有必要捕获&os
(在我的真实代码中)时,我遇到了这个问题。删除它后,我错失了找到该构建的工作机会。
答案 0 :(得分:22)
有一个开放的clang report涵盖了lambda表达式隐式捕获引用的情况,这不仅限于std::cout
,还包括被发现引用常量表达式的引用变量。
有关更多参考,CWG上的后备缺陷报告为CWG-1472
编辑:
基于@ Rakete1111的评论,我应该明确指出clang正确地接受了代码, 这是应用上述CWG缺陷的结果。由于以下原因,该报告被重新打开 诊断位置不是因为他们对接受的理解是错误的