如何为std :: fill()使用C++ 0x lambdas局部变量?

Bud*_*son 4 c++ lambda fill iota c++11

所以我试图测试lambda访问它所使用的范围内的局部变量,大致基于Bjarne在C++ 0x FAQS页面上的一个简单例子:http: //www2.research.att.com/ 〜BS/C++ 0xFAQ.html#拉姆达

当我尝试这个简单的测试代码时:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//Test std::fill() with C++0x lambda and local var
void f (int v) { 
    vector<int> indices(v);
    int count = 0;
    fill(indices.begin(), indices.end(), [&count]() {
        return ++count;
    });

    //output test indices
    for (auto x : indices) {
        cout << x << endl;
    }
}

int main() {
    f(50);
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

required from 'void std::fill(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = __gnu_cxx::__normal_iterator<int*, std::vector<int> >, _Tp = f(int)::<lambda()>]'
Run Code Online (Sandbox Code Playgroud)

我假设这个errmsg表明std :: fill()签名需要一个const Type&用于新的value元素赋值.

但是如果我能够为此目的使用fill(),正如Bjarne的例子所示,我不需要在lambda capture子句中使用引用'[&count]'来重新分配原始的index元素值,递增计数var通过'return ++ count;' lambda语句块?

我承认我还不太了解这些lambdas!:)

Nic*_*las 16

Bjarne的例子没有编译.除非std::fill在C++ 0x中定义不同,否则它无法编译.也许它来自一个std::fill可能需要一个功能的概念版本,但它的实际版本(根据N3242的第25.1节)采用一个对象,而不是一个函数.它将该对象复制到列表的每个元素中.这就是那个人想做的事情.

你正在寻找的功能是std::generate.

  • 正确的是,看到这个例子后我有点困惑. (2认同)