首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有相同名称的Lambda捕获和参数-谁隐藏了另一个?(当当vs gcc)

具有相同名称的Lambda捕获和参数-谁隐藏了另一个?(当当vs gcc)
EN

Stack Overflow用户
提问于 2017-02-07 18:56:30
回答 1查看 5.8K关注 0票数 125
auto foo = "You're using g++!";
auto compiler_detector = [foo](auto foo) { std::puts(foo); };
compiler_detector("You're using clang++!");

  • clang++ 3.6.0和更新版本会打印出“You‘’re clang++!”并警告unused.
  • g++ 4.9.0和更新版本的capture foo将打印出“You‘’re g++!”并警告未使用参数 foo

哪种编译器能更准确地遵循C++标准?

EN

回答 1

Stack Overflow用户

发布于 2017-02-07 19:51:01

我试着把对这个问题的一些评论整理在一起,给你一个有意义的答案。

首先,请注意:

在特定情况下,

  • 具有闭包类型,该闭包类型具有接受名为foo

的参数的公共内联模板函数调用运算符(

因此,逻辑会让我第一眼看到参数应该隐藏在捕获的变量中,就好像在:

struct Lambda {
    template<typename T> void operator()(T foo) const { /* ... */ }
    private: decltype(outer_foo) foo{outer_foo};
};

无论如何,@n.m.正确地指出,为复制捕获变量声明的非静态数据成员实际上是未命名的。也就是说,未命名的数据成员仍然通过标识符(即foo)来访问。因此,函数调用操作符的参数名称应该(我说)仍然隐藏在该标识符的后面。

正如@n.m.正确指出的那样。在对问题的评论中:

原始捕获的实体...应根据作用域规则正常映射

正因为如此,我会说clang是正确的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42088015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档