Coder Social home page Coder Social logo

Comments (5)

Quuxplusone avatar Quuxplusone commented on August 16, 2024 1

@tomjwaldron: Agreed, and expected. Here's your example reduced even further: https://godbolt.org/z/6Wac8s938

stdext::inplace_function<void()> f;
stdext::inplace_function<void()> g = f;  // OK
stdext::inplace_function<void()> h = [f]() { f(); };  // error

Since inplace_function doesn't heap-allocate, it needs to have enough room inside its own memory footprint to store whatever callable you're putting into it. If you put in something bigger than the inplace_function itself (such as a lambda capturing an inplace_function by value), then of course that won't work — and inplace_function specifically refuses to heap-allocate any more space to hold that big callable. (Its stubborn compile-time refusal to heap-allocate is "a feature, not a bug.")

One way to (work around, fix) your original code would be to make two sizes of type-erased functions: one to hold callbacks, and one to hold lambdas-that-capture-the-first-kind. https://godbolt.org/z/9xEYPM75W

    using SmallerEventFunction = stdext::inplace_function<void()>;
    using EventFunction = stdext::inplace_function<void(), sizeof(SmallerEventFunction)>;

This guarantees that std::is_constructible_v<EventFunction, SmallerEventFunction>.

from sg14.

Quuxplusone avatar Quuxplusone commented on August 16, 2024

I can generate some example cases if you guys are unaware of this circumstance

Yes please. http://sscce.org

inplace_function should only ever need ~16 bytes more Capacity than the sizeof the object you're trying to store in it. So it should never require Capacity=10000 unless you're trying to store something big — like, say, [r = std::mt19337()]() { return r(); }.

from sg14.

Quuxplusone avatar Quuxplusone commented on August 16, 2024

@victorstewart, were you able to reproduce the issue?

from sg14.

victorstewart avatar victorstewart commented on August 16, 2024

sorry! been so busy with my beta :). i’ll get you those test cases this weekend

from sg14.

tomjwaldron avatar tomjwaldron commented on August 16, 2024

I ran into this issue. Might be a little contrived, I'm not sure, but here's an example where std::function works fine but stdext::inplace_function doesn't: https://godbolt.org/z/KcfYsvd15
error: static_assert failed due to requirement 'sizeof((lambda at <source>:26:21)) <= 32UL' "inplace_function cannot be constructed from object with this (large) size"

from sg14.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.