为了更好地理解C++ lambdas的实现,我欺骗了编译器将lambda视为一个对象,似乎它们在内存中的布局相同.
注意:这只是为了澄清,我不是在提倡在生产中编写这些类型的黑客
这是由语言规范还是编译器实现细节保证的?
struct F
{
int a; int b; int c;
void printLambdaMembers()
{
cout << this << endl; // presumably the lambda 'this'
cout << a << endl; // prints 5
cout << b << endl;
cout << c << endl;
}
};
void demo()
{
int a = 5;
int b = 6;
int c = 7;
auto lambda = [a,b,c]() { cout << "In lambda!\n"; };
// hard cast the object member function pointer to the lambda function
void(decltype(lambda)::*pf)() const = (void(decltype(lambda)::*)() const) (&F::printLambdaMembers);
// run the member function on the lambda pointer
(lambda.*pf)(); // we get 5,6,7
}
Run Code Online (Sandbox Code Playgroud)
该标准不要求lambda闭包具有特定的布局.见[expr.prim.lambda.closure]:
lambda表达式的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合类类型,称为闭包类型,其属性如下所述.
...
闭包类型不是聚合类型.实现可以定义闭包类型与下面描述的不同,前提是这不会改变程序的可观察行为,只需更改:
- 封闭类型的大小和/或对齐方式,
- 封闭类型是否可以轻易复制,或者
- 闭包类型是否为标准布局类.
实现不应将rvalue引用类型的成员添加到闭包类型.
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |