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

标签 c++ c++11 lambda capture

我注意到允许使用 lambda 中未捕获的变量的编译时特性,例如调用sizeofdecltype函数,例如:

#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 只会增加完全没有意义的开销。不仅如此,它甚至可能使编译器的内部工作复杂化,因为它们将不再能够简单地优化 ysizeof(y) 在语义上不再是等价的到 sizeof(int)

关于c++ - 能够在 lambda 中使用非捕获局部变量的编译时特性有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30669003/

相关文章:

node.js - 处理 Postgres 表中所有数据的最快方法?

c++ - Bjarne Stroustrup 的 P :PP Chapter 4 Drill

c++ - 在 C++11 中使用 auto 和 decltype

c# - 从 Func<bool, T> 或类似的 lambda 中提取信息

python - 如何在数据帧上使用 UserDefinedFunction 解决错误 "Method __getnewargs__([]) does not exist"?

c++ - 在 C++ 中填充一个数组

c++ - 使用 seekg 和 seekp 得到错误的输出

assert.h 中的 C++ 断言实现

c++ - 需要有关在 VS2010 中运行程序的帮助

c++ - 当 A 和 B 没有共同的祖先时,通过 dynamic_cast 从 A* 转换为 B* 是否有效?