Hello all, I think the gcc compiler should not accept assignments to non-lvalues. gcc does this however, but does not execute the assignment (probably the assignment is executed on a copy, but that copy is entirely floating).
Here is my code: #include <stdio.h> #include <stdlib.h> #include <string.h> template<class T> class SuperArray { T **block; int size; public: SuperArray() { block = (T **) calloc (32768, sizeof(T *)); if (!block) exit (1); size = 0; } void Wipe() { int k; for (k=0; k<=size-1>>16; k++) free (block[k]); size = 0; } ~SuperArray() { int k; for (k=0; k<=size-1>>16; k++) free (block[k]); free (block); } T /*&*/operator[] (int index) { if (index < 0) exit (1); // range check for debugging if (index < size) return block[index>>16][index&65535]; if (index > size) exit (1); // range check for debugging // size must increase int k; for (k=(size-1>>16)+1; k<=(index>>16); k++) { block[k] = (T *) calloc (65536, sizeof (T)); if (!block[k]) exit (1); } size = index + 1; return block[index>>16][index&65535]; } T *operator+ (int index) { if (index < 0) exit (1); // range check for debugging if (index < size) return block[index>>16] + (index&65535); if (index > size) exit (1); // range check for debugging // size must increase int k; for (k=(size-1>>16)+1; k<=(index>>16); k++) { block[k] = (T *) calloc (65536, sizeof (T)); if (!block[k]) exit (1); } size = index + 1; return block[index>>16] + (index&65535); } }; struct string100 { char value[100]; }; main () { SuperArray<string100> a; strcpy ((a + 0)->value, "No assignment."); strcpy (a[0].value, "Non-lvalue assignment."); // illegal printf ("%s\n", (a + 0)->value); }