web-dev-qa-db-ja.com

エンクロージング関数のローカル変数は、キャプチャリストにある場合を除き、ラムダ本体で参照できません

Json :: valueオブジェクトがあり、構造体の値を取得しようとしましたが、キャプチャリストに関するこのエラーが発生しました。私はそのフレーズでこのブレース[]がキャプチャリストを保持していることを理解していますが、どうすればよいかわかりません。ラムダ関数で値を返すにはどうすればよいですか?

   void JsonDeneme::setValues(json::value obj)
{
    weather.coord.lon = obj.at(L"coord").at(L"lon").as_double();
    weather.coord.lat= obj.at(L"coord").at(L"lat").as_double();

}

void JsonDeneme::getHttp()
{
    //json::value val;
    http_client client(U("http://api.openweathermap.org/data/2.5/weather?q=Ankara,TR"));

    client.request(methods::GET)

    .then([](http_response response) -> pplx::task<json::value>
    {

        if (response.status_code() == status_codes::OK)
        {
            printf("Received response status code:%u\n", response.status_code());
            return response.extract_json();
        }
        return pplx::task_from_result(json::value());
    })

    .then([ ](pplx::task<json::value> previousTask)
    {
        try
        {
            json::value   v = previousTask.get();
            setValues(v);//-----------------------------------------
        }
        catch (http_exception const & e)
        {
            wcout << e.what() << endl;
        }
    })
    .wait();

}
28
user2957741

キャプチャリストは、角括弧の間に配置するものです。この例を見てください:

_void foo()
{
    int i = 0;
    []()
    {
        i += 2;
    }
}
_

ここで、ラムダは何もキャプチャしないため、外側のスコープにアクセスできず、iが何であるかがわかりません。それでは、参照でeverythingをキャプチャしましょう。

_void foo()
{
    int i = 0;
    [&]()//note the &. It means we are capturing all of the enclosing variables by reference
    {
        i += 2;
    }
    cout << 2;
}
_

この例では、ラムダ内のiは、外側のスコープ内のiへの参照です。

この例では、オブジェクトのメンバー関数内にラムダがあります。オブジェクトの関数setValues(v)を呼び出そうとしていますが、キャプチャリストが空なので、ラムダはsetValuesが何であるかを知りません。ラムダでthisをキャプチャすると、ラムダはオブジェクトのすべてのメソッドにアクセスできます。これは、setValues(v)this->setValues(v)と同じであるためです。エラーはなくなります。

56
SingerOfTheFall