我注意到允许使用 lambda 中未捕获的变量的编译时特性,例如调用sizeof
、decltype
函数,例如:
#include <iostream>
void f ()
{
}
int main()
{
int y = 13;
auto x = []{ return sizeof (decltype (y));};
std::cout << x () << '\n';
}
因为 g++
和 clang++
都能正确编译这个程序,我猜这是标准允许的。
虽然我想不出任何特定的恶意案例会导致错误,但这对我来说似乎有点误导。但我想知道此功能的实际用例是什么?
最佳答案
您可能会使用它的一个简单示例是,如果您有一个 lambda,您希望在其中执行与 y
相同类型的计算,因为您会将结果分配给 y
.
另外,反过来想想:在 [=]{ return x + sizeof (y);}
中捕获 y
有什么好处?这样做绝对没有意义,因为 y
实际上并没有在 lambda 内部使用。捕获 y
只会增加完全没有意义的开销。不仅如此,它甚至可能使编译器的内部工作复杂化,因为它们将不再能够简单地优化 y
, sizeof(y)
在语义上不再是等价的到 sizeof(int)
。
关于c++ - 能够在 lambda 中使用非捕获局部变量的编译时特性有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30669003/