能够在lambda中使用非捕获局部变量的编译时特性有什么意义?

Pre*_*nik 6 c++ lambda capture c++11

我注意到允许一个人使用未在lambda中捕获的变量的编译时特性,例如call sizeof,decltypefunctions,例如:

#include <iostream>
void f ()
{
}

int main()
{
  int y = 13;
  auto x = []{ return sizeof (decltype (y));};
  std::cout << x () << '\n';
}
Run Code Online (Sandbox Code Playgroud)

由于这两个g++clang++没有错误编译这个节目,我想这是标准允许.

这似乎有点误导我,即使我想不出任何会导致错误的特殊恶意案件.但我想知道这个功能的实际用例是什么?

小智 5

您可以使用此示例的一个简单示例是,如果您有一个lambda,您希望以相同的类型执行计算y,因为您将分配结果y.

此外,认为它周围的其他方法:什么是捕获的好处y[=]{ return x + sizeof (y);}?这样做绝对没有意义,因为y实际上并没有在lambda中使用.捕获y只会增加完全没有意义的开销.不仅如此,它甚至可能使编译器的内部工作复杂化,因为它们不再能够简单地优化y掉,sizeof(y)不再在语义上等同于sizeof(int).