But as long as I instance those as pointers-to-GArray, then it happens something strange.
In the myArr[0] = 9, 9 becomes the SIZE of myArr instead of replacing the index 0 with the value 9 http://i.stack.imgur.com/i2fdv.png
If myArr is a pointer doing myArr[i] is equivalent to *(myArr + i).
So doing
myArr[0] = 9;
is just the same as writing
*myArr = 9;
It doesn't make much sense to assign an integer to the GArray but it will compile because you have a non-explicit constructor that takes an int as argument, so what really happens is this:
*myArr = GArray<int>(9);
To assign 9 to the first element in the GArray you need to first dereference the pointer.
It is not possible to give an error if someone uses array indexing syntax on a pointer because that is perfectly valid for pointers, and nothing you have control over.
1 2 3 4 5
myArrPtr[0] = GArray<int>(9); // Will compile and work perfectly.
myArrPtr[8] = GArray<int>(9); // This will compile, but will not
// work correctly because myArrPtr[8]
// is not a valid object.