Henry Robinson created KUDU-2028:
------------------------------------

             Summary: Async Proxy callbacks cannot capture non-copyable types
                 Key: KUDU-2028
                 URL: https://issues.apache.org/jira/browse/KUDU-2028
             Project: Kudu
          Issue Type: Improvement
            Reporter: Henry Robinson
            Assignee: Henry Robinson
            Priority: Minor


Callbacks that are passed to {{Proxy::AsyncRequest()}} are passed by reference. 
They are then passed by value into {{OutboundCall()}}, where that copy is saved.

This means that you can't have a callback that captures a non-copyable type:

{code}
unique_ptr<Foo> my_foo = make_unique<Foo>();
auto cb = [f(move(my_foo))]() {

};
proxy->AsyncRequest("method", req, response, controller, cb); // <-- error, 
missing copy c'tor for unique_ptr<Foo>
{code}

This is a sometimes useful idiom for passing ownership of something into the 
callback, where it can get destroyed some time in the future, after the caller 
has ceased to exist. 

A solution would be for {{AsyncRequest()}} (and its generated wrappers) to take 
a {{ResponseCallback}} by value, and to {{move()}} it until it was copied. This 
kind of transformation has its drawbacks (if for some reason the parameter 
doesn't get copied, it is more expensive than pass-by-reference), but seems a 
reasonable tradeoff here.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to