gpt4 book ai didi

c++ - lambda 捕获的对 std::cout 的本地引用而不要求它

转载 作者:IT老高 更新时间:2023-10-28 12:37:49 26 4
gpt4 key购买 nike

我是不是疯了?这总是被允许的吗?

#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.

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

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

最佳答案

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

如需更多引用,CWG 的支持缺陷报告为 CWG-1472

编辑:

基于@Rakete1111 评论,我应该明确指出,clang 接受代码是正确的,这是应用上述 CWG 缺陷的结果。该报告被重新打开是因为诊断地点不是因为他们对验收有误

关于c++ - lambda 捕获的对 std::cout 的本地引用而不要求它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53415281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com