C++ 是否可以在lambda中找到捕获变量的数量/类型?

C++ 是否可以在lambda中找到捕获变量的数量/类型?,c++,c++11,lambda,c++14,C++,C++11,Lambda,C++14,当通过值或引用访问时,是否可以自动实现lambda捕获的变量数?还有可能破译它们的类型吗?例如,假设这段代码: int a = 47; int b = 48; long long c = 49; auto f1 = [=](){ return a + b; }; auto f2 = [=](){ return a + b + c; }; 如果像下面这样调用,是否可以让名为count\u args的函数在一行中返回2,在下一行中返回3 std::cout << count_args(

当通过值或引用访问时,是否可以自动实现lambda捕获的变量数?还有可能破译它们的类型吗?例如,假设这段代码:

int a = 47;
int b = 48;
long long c = 49;
auto f1 = [=](){ return a + b; };
auto f2 = [=](){ return a + b + c; };
如果像下面这样调用,是否可以让名为
count\u args
的函数在一行中返回
2
,在下一行中返回
3

std::cout << count_args( f1 ) << "\n" << count_args( f2 );

std::cout否,因为问题隐含地假设捕获的变量实际上是成员变量。然而,编译器被授予了更大的自由度。正如Ajay在评论中指出的,一个好的优化器可以用提升的表达式替换成员,还可以更改类型,使用非C++类型,等等。因此,您可以捕获
struct color{char R,G,B}
,而lambda实际上只存储
.R
.G
。现在是2/3吗?

我非常怀疑。这样做有什么好处吗?一些非常不受欢迎的解决方案是使用sizeof。它将在ideone中给出4和8:也可以这样读:就像struct members说的,你有这个
struct X{T a,b;U c;}。现在的问题就像问
count\u args(X)
。在我看来,没有反射,是不可能的,你自己设置反射能力,或者C++将这个特性添加为核心语言特征。optMMI化至少可以做到这一点:<代码> F1 < /代码>返回<代码> 95 < /代码>,<代码> F2< /代码>返回<代码> 144 < /C>。因此,对捕获的变量进行计数是没有意义的,即使使用相同的编译器也不具有可移植性。<代码>(2 +i)/3 < /COD>自然(或<代码>(2 -J)/3 < /代码>电气工程师)我知道“恒定传播”是编译器优化,我知道C++编译器应该/将这样做,正如阿杰伊指出的那样。也许我最好澄清一下,假设捕获的变量没有优化掉。