0

これが機能しない理由がわかりません。std::findメソッドの結果を返す関数があります。見つかったオブジェクトにイテレータを返すことを読みました。しかし、その値を返すラムダを渡そうとすると、大量のエラーが発生するのはなぜですか?

void f(std::function<std::vector<int>::iterator()>) {}

int main()
{
    std::vector<int> v{0, 1, 2, 3};

    auto p = [=] (int n) {
        return std::find(v.begin(), v.end(), n);
    };

    f(p);
}

意味不明なエラーが多い。ここで型チェックを行ったところ、true が返されました。

std::is_same<std::vector<int>::iterator, decltype(std::find(v.begin(), v.end(), N))>::value;
// -> true

では、この型を返す関数をfwithに渡すと、なぜこれが機能しないのでしょうか?std::function

4

3 に答える 3

4

intパラメータに欠落しているstd::functionパラメータがコピーアンドペーストの間違いであると仮定すると、明らかにv.begin()、通常のイテレータではなくsがv.end()返されます。const_iterator

これは、ラムダが値でキャプチャし、std::vector const(したがってそのイテレータ)を作成していたためです。参照によってすべてをキャプチャすることは機能します。そうでない場合は、 :std::functionを返す必要があります。const_iterator

#include <vector>
#include <functional>
#include <algorithm>

void f(std::function<std::vector<int>::iterator (int)>) {}

int main()
{
    std::vector<int> v{0, 1, 2, 3};

    auto p = [&] (int n) {
        return std::find(v.begin(), v.end(), n);
    };

    f(p);
}
于 2013-01-18T23:03:03.967 に答える
2

値でキャプチャしているため、デフォルトでは、キャプチャされたvector(および関連するイテレータ)がconst使用されます。可変にしたい場合は、ラムダを変更する必要があります。

auto p = [=] (int n) mutable {
    return std::find(v.begin(), v.end(), n);
};
于 2013-01-18T23:05:05.653 に答える
1

f は引数を取らない関数を想定していますが、ラムダには int パラメーターが 1 つあるためです。

于 2013-01-18T22:58:10.590 に答える