auto foo = "You're using g++!";
auto compiler_detector = [foo](auto foo) { std::puts(foo); };
compiler_detector("You're using clang++!");
foo
将打印出“You‘’re g++!”并警告未使用参数 foo
。哪种编译器能更准确地遵循C++标准?
发布于 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是正确的。
https://stackoverflow.com/questions/42088015
复制相似问题