Try to translate http://perl.plover.com/Stream/stream.html into C++ iterators to see how the current abstraction limits the ways you can think about a program. By contrast suppose that my hypothetical iterator< foo > type was required to have a pointer overload, and supported the methods done() and next(). Now go back and try to translate that article - you'll find that it is pretty easy.
That article demonstrated the power of this idea by writing code that fairly efficiently generates the Hamming sequence, which consists of all positive integers whose only divisors are 2, 3, and 5. (So 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, ...)
C++ is for larger , high performance applications.
The piper needs to be paid one way or another. If you rewrite a perl script in C++ for performance, the relative increase in verbosity is the price you pay.
However I believe that a substantial amount of verbosity could be removed without impacting said performance. In fact C++11 removes some with type deduction.
I also get tired of typing some_big_type foo = some_big_type(); - is there a way to say, "I want this thing, and I want it to get the obvious default initialization?" Because what I type now is straight from the redundant department of redundancy department. (Yes, a typedef can make that shorter. You still write the idea twice.)
If you're not talking about initialization, but instead talking about construction, just do some_big_type foo; (no parens needed).
I thought I was very clear when I said: "I want this thing, and I want it to get the obvious default initialization?"
I often wound up typing something like this:
std::vector< my_big_type > list_foo = std::vector< my_big_type >();
It seemed useless the first time, and just got sillier as time went on.
Now foo has been created.
Want to pass parameters to its constructor:
some_big_type foo(parameters, go, here);
foo has been initialised.
Need a pointer?
auto *foo = new some_big_type foo(parameters, go, here);