Enum member std.traits.hasElaborateAssign
True if S or any type directly embedded in the representation of S
   defines an elaborate assignment. Elaborate assignments are introduced by
   defining opAssign(typeof(this)) or opAssign(ref typeof(this))
   for a struct or when there is a compiler-generated opAssign.
						
				enum hasElaborateAssign(S)
				 = hasElaborateAssign!(typeof(S
				A type S gets compiler-generated opAssign in case it has
   an elaborate copy constructor or elaborate destructor.
Classes and unions never have elaborate assignments.
Note
Structs with (possibly nested) postblit operator(s) will have a hidden yet elaborate compiler generated assignment operator (unless explicitly disabled).
Example
static assert(!hasElaborateAssign!int);
static struct S  { void opAssign(S) {} }
static assert( hasElaborateAssign!S);
static assert(!hasElaborateAssign!(const(S)));
static struct S1 { void opAssign(ref S1) {} }
static struct S2 { void opAssign(int) {} }
static struct S3 { S s; }
static assert( hasElaborateAssign!S1);
static assert(!hasElaborateAssign!S2);
static assert( hasElaborateAssign!S3);
static assert( hasElaborateAssign!(S3[1]));
static assert(!hasElaborateAssign!(S3[0]));
Authors
Walter Bright,
            Tomasz Stachowiak (isExpressions),
            Andrei Alexandrescu,
            Shin Fujishiro,
            Robert Clipsham,
            David Nadlinger,
            Kenji Hara,
            Shoichi Kato