【发布时间】:2020-02-20 15:22:21
【问题描述】:
在这个 sn-p 中,我在 lambda 的捕获中声明了一个变量 i。
int main()
{
vector<int> vec;
// Pushing 0-99 numbers to vector
std::generate_n(std::back_inserter(vec), 100, [i = 0]() mutable { return i++; });
return 0;
}
正如大家所见,i 没有任何类型。
据我所知,可以这样写等效功能:
int main()
{
vector<int> vec;
// Pushing 0-99 numbers to vector
std::generate_n(std::back_inserter(vec), 100, [](){
static int i = 0;
return i++; });
return 0;
}
编译器是如何知道第一个例子中i的类型的?是不是我对它的操作推导出来的(++)?是不是因为容器知道是int?
使用 -std=c++14 和 -std=c++17 编译 GCC 时没有任何问题。 不过,如果我使用 -std=c++11 进行编译,我会收到以下警告:
lambda_test.cpp: In function ‘int main()’:
lambda_test.cpp:24:51: warning: lambda capture initializers only available with -std=c++14 or -std=gnu++14
std::generate_n(std::back_inserter(first), 100, [i = 0]() mutable { return i++; });
^
MORE:考虑到 cmets,我尝试查看编译器为 c++11 和 14 生成的内容的差异,但它生成的代码相同: https://cppinsights.io/s/43411e6f
【问题讨论】:
标签: c++ lambda capture type-deduction