【发布时间】:2014-02-18 20:48:29
【问题描述】:
AFAIK,C++11/14 不允许在定义 lambda 时就地定义新的返回类型。但是,似乎 C++14 lambda 捕获表达式本质上创建了一个具有一个或多个“成员”和一个运算符 () 的匿名类型。那么,为什么编译器不允许从外部 lambda 访问捕获的成员。我虚弱的头脑无法处理 C++ 的复杂性,但它对您来说听起来像是一种合理的语言扩展吗?这是一个例子。
vector<string> words = { "Stack", "Overflow" };
auto l = [w = words](){}; // almost like a C# anonymous type
cout << l.w[0]; // does not work.
【问题讨论】:
-
“AFAIK,C++11/14 不允许在定义 lambda 时就地定义新类型。” 你是什么意思?在 lambda-capture 内部还是 lambda-body 内部?
-
我的意思是更像一个新的返回类型。
-
AFAIK,C++中有匿名本地类
vector<string> words = { "Stack", "Overflow" }; struct { decltype(words) w; } l{words}; cout << l.w[0];Live example -
当然不行。数据成员应该是私有的!
-
@n.m.如果类型暴露在“模块”之外,这是合理的。在本地上下文中(例如,在表达式、函数甚至类中),我更喜欢使用公共成员。