On Wednesday, 12 September 2018 at 23:41:16 UTC, James Blachly wrote:
When I add the "shared" attribute to an array, I am no longer able to call reserve because the template won't instantiate:

Error: template object.reserve cannot deduce function from argument types !()(shared(int[]), int), candidates are:
/dlang/dmd/linux/bin64/../../src/druntime/import/object.d(4091):
      object.reserve(T)(ref T[] arr, size_t newcapacity)

1. Shared modifies the type, so the template does not match. Even casting does not seem to work however. Is there something about shared that makes it unable to be taken by reference? 2. Is there a workaround for me to be able to preallocate the array?

Kind regards

I'm guessing you tried something like:

    shared char[] x;
    // Doesn't work; it casts the result of x.reserve
    cast(char[])x.reserve(100);
// Doesn't work; (cast(char[])x) is not an lvalue, so it can't be ref
    (cast(char[])x).reserve(100);

Arrays are passed and stored like pointers, and `reserve` modifies the array, which is why the thing needs to be ref.

Anyway, it works like this:

    // Cast and store in a variable so it can be ref
    auto b = cast(char[]) x;
    // Okay, reallocates b (changes b.ptr), doesn't change x
    b.reserve(100);
    // Copy changes back to the shared variable
    x = cast(shared) b;

Reply via email to