The insert function takes iterators as template parameters, meaning "whatever iterator types indicating a source range you've to copy from".
The erase function, in contrast, requires iterators from the same container you're erasing.
They cannot be "const" (because the container isn't const, since you're modifying it) nor "reverse" (because of the way elements in vectors are managed).
The C2059 error is a compiler problem. It sees const double** const example3( and thinks it's a function declaration - and you can't have the new keyword in a function declaration. g++ compiles that declaration with no problem.
As for the rest…that's the rules of C++. If you really want to do it, you'll have to use an explicit cast.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p