On Saturday, 12 August 2017 at 17:52:47 UTC, Dgame wrote:

auto s(T, size_t n)(T[n] values) {
        return values;

assert(equal(a[], [S(0), S(1)].s));

This seems to work, but I'm trying to determine if it's 100% guaranteed safe.

Tacking on @nogc doesn't seem to stop it from working, so that checks out, but my example print's "postblit" three times:

struct S {
    int x;
    this(int x) @nogc { this.x = x; }
    this(this) @nogc { printf("postblit\n"); }

auto s(T, size_t n)(T[n] values) @nogc {
    return values;

void main(string[] args) @nogc {
    foreach(ref s; [S(0), S(1), S(2)].s)
        printf("%d\n", s.x);

So I think what's happening is that the array is moved into the argument of s(), then copied to the return value, which resides on the parent stack frame of s(), meaning that it's safe from the body of the foreach clobbering it...is that correct?

Assuming this is safe though, it would be nice to eliminate the postblits too. It seems like it should be move-move instead of a move-copy. I tried "return move(values);" but that still didn't help.


Reply via email to