tags:

views:

1032

answers:

11

Hi all.

Recently I started reading (just a bit) the current draft for the future C++0x standard.

There are lots of new features, some of them already available via Boost Libs. Of course, I'm pretty happy with this new standard and I'd like to play with all the new features as soon as possibile.

Anyway, speaking about this draft with some friends, long-time C++ devs, some worries emerged. So, I ask you (to answer them):

1) The language itself

This update is huge, maybe too huge for a single standard update. Huge for the compiler vendors (even if most of them already started implementing some features) but also for the end-users.

In particular, a friend of mine told me "this is a sort of new language".

  • Can we consider it a brand new language after this update?
  • Do you plan to switch to the new standard or keep up with the "old" standard(s)?

2) Knowledge of the language

  • How the learning curve will be impacted by the new standard?
  • Teaching the language will be more difficult?
  • Some features, while pretty awesome, seem a bit too "academic" to me (as definition I mean). Am I wrong?
  • Mastering all these new additions could be a nightmare, couldn't it?

Thanks

+6  A: 

Your friend is partially right but mostly wrong: it's the same language with extra features.

The good thing is, you don't have to master all the new features. One of the primary mandates for a standards body is to not break existing code, so you'll be able to go on, happily coding in your old style (I'm still mostly a C coder even though I do "C++" applications :-).

Only when you want to have a look at the new features will you need to bone up on the changes. This is a process you can stretch over years if need be.

My advice is to learn what all the new features are at a high level (if only to sound knowledgeable in job interviews) but learn the details slowly.

paxdiablo
+8  A: 

1) The language itself

As far as I'm aware, there are really no breaking changes between C++'03 and C++'0x. The only one I can think of here relates to using auto as a storage class specifier, but since it had no semantic meaning I don't see that being an issue.

There are a lot of other academic fixes to the standard which are very necssary, for example better descriptions for the layout of member data. Finally, with multi-core/cpu architectures becoming the norm, fixing the memory model was a must.

2) Knowledge of the language

Personally, I feel that for 99.9% of C++ developers the newer language is going to be easier to use. I'm specifically thinking of features such as auto, lambda's and constexpr. These features really should make using the language more enjoyable.

At a more advanced level, you have other features such as variadic templates etc that help the more advanced users.

But there's nothing new here, I'm still surprised at the amount of everyday C++ developers that haven't used (or even heard of) the STL.

From a personal perspective, the only feature I'm a bit concerned about in the new standard is that of concepts. As it is such a large change, the same problems that occurred with templates (ie. completely broken implementations) is a real danger.

Richard Corden
I think Concept will fix most of the problems with template usage (and debugging).Anyway, maybe you should add that future new user of C++ will not require to know all the old rules of the language that will be quite well replaced by some new features.
Klaim
I know some people using C++ as an easy-to-use C: no classes, no iostreams, no STL, ...I love concepts but I think they are a bit tricky to understand and use for the average programmer.Thanks.
Gian Paolo Ghilardi
+4  A: 

Do you plan to switch to the new standard or keep up with the "old" standard(s)?

A year ago, I was writing strict C89, because the product in question was aggressively portable to embedded platforms, some of which had compilers with radically different ideas of which bits of C99 it's worth supporting. So a 20-year-old standard still hasn't been fully replaced by its 10-year-old successor.

So I don't expect to be able to get away from C++03 any time soon.

I do expect to use C++0x features where appropriate. Just as I use C99 features in C code, and gcc extensions in C and C++ (and would use MSVC extensions, although I've never worked on MSVC-only code for more than trivial amounts of time). But I expect it to be "nice to have" rather than baseline, pretty much indefinitely.

Steve Jessop
+4  A: 

Your programming career will always involve learning and re-learning. You can't expect c++ to stay the same till you retire and to be using the same methods and practises that you were using 40 years ago. Technology rolls on, and it rolls quickly. It's your job to keep up with it. Of course you can ignore that, and continue to work the same way you currently do, but in 5 / 10 years time you'll become so outdated that you'll be forced to learn it all then when you're trying to change job. And it will have been a lot easier to learn on the job all those years before :)

Mark Ingram
As said before, I like the standard.My worry is about some programmers who may abuse all the new features just for the sake of looking "cool" (actually not a C++-only problem)...
Gian Paolo Ghilardi
That's the same as all programming, use the tools that best suit the situation.
Mark Ingram
+2  A: 

Whether or not we can consider it a "new language", I think that's semantics. It doesn't make a difference. It's backwards compatible with our current C++ code, and it's a better language. Whether or not we consider it "the same language" doesn't matter.

About learning the language, remember that a lot of the new features are there to make the language easier to learn and use. Most of the features that add complexity are intended for library developers only. They can use these new features to make better, more efficient, and easier to use libraries, that you can then use without knowing about the features. Several of the changes actually simplify and generalize existing features, making them easier for newcomers to learn.

It is a big update, yes, but it is guided by a decade of experience with the current C++ standard. Every change is there because experience has shown that it is needed. In fact, the committee is being extremely cautious and conservative, and have refused a huge number of other language improvements. What is added here is only the fundamentals that 1) everyone could agree on, and 2) could be specified in time, without delaying the new standard.

It is not simply a few language designers sitting down and brainstorming new features they'd like to try.

jalf
Just for instance, I'm absolutely happy with rvalues but the rvalue/lvalue semantic difference seems a bit too academic to me, at least in the definition. That said I think this new feature is too good to be ignored by most programmers and/or treated as a library-only stuff, isn't it?
Gian Paolo Ghilardi
It is one of the features that are *mainly* intended for library developers. It enables some fairly major performance improvements in the STL, for example. It's not a feature I'd expect to see used a lot in application code. Most people can safely ignore the feature and simply enjoy that their STL code just became that much faster. But of course, if you do understand the feature, you'll probably be able to make use of it yourself as well.
jalf
+5  A: 

In some respects, C++0x should be easier to teach/learn than current C++:

  • Looping through a container - the new for syntax is far easier than for_each + functor or looping manually using iterators
  • Initialising containers: we'll be able to initialise sequences with the same syntax as arrays
  • Memory management: out goes dodgy old auto_ptr, in comes well-defined unique_ptr and shared_ptr

Lambdas, although necessarily more complex than other languages' equivalents, will be easier to learn than the C++98 process of defining function objects in a different scope.

James Hopkin
+2  A: 

A few months ago I heard Stroustrup give a talk titled 50 years of C++. Admittedly, I'm not a C++ programmer, but it seemed to me that he certainly doesn't think 0x is a new language!

PTBNL
+2  A: 

Concepts and Concept Maps are going to greatly increase the grokability of template frameworks. If you've ever poured over the Boost source you'll know what I mean. You're constantly going from source to docs because the language just doesn't have the facilities to express template concepts. Hopefully Concepts + Duck Typing will give us the best of both worlds whereby entry points to template libraries can explicitly declare requirements but still have the freedom that Duck Typing provides when writing generic code.

There are lots of good things in C++0x, but they're mostly evolutionary changes that refine or extend existing ideas. I don't think it's different enough to justify calling it a "new language".

+6  A: 

In short, no, we can't consider this a new language. It's the same language, new features. But instead of being bolted on by using the Boost libs, they're now going to be standard inclusions if you're using a compiler that supports the x0 standard.

One doesn't have to use the new standard while using a compiler that supports the new standard. One will have to learn and use the new standard if certain constraints exist on the software being developed, however, but that's a constraint with any software endeavor. I think that the new features that the x0 standard brings will make doing certain things easier and less error prone, so it's to one's advantage to learn what the new features are, and how they will improve their design strategy for future work. One will also have to learn it so that when working on software developed with it, they will understand what's going on and not make large boo-boos.

As to whether I will "switch to the new standard", if that means that I will learn the new standard and use it where applicable and where it increases my productivity, then yes, I certainly plan to switch. However, if this means that I will limit myself to only working with the new features of the x0 standard, then no, since much of my work involves code written before the standard and it would be a colossal undertaking to redesign everything to use the new features. Not only that, but it may introduce new bugs and performance issues that I'm not aware of without experience.

Learning C++ has always been one of the more challenging journeys a programmer can undertake. Adding new features to the language will not change the difficulty of learning its syntax and how to use it effectively, but the approach will change. People will still learn about pointers and how they work, but they'll also learn about smart pointers and how they're managed. In some cases, people will learn things differently than before. For example, people will still need to learn how to initialize things, but now they'll learn about Uniform Initialization and Initializer Lists as primary ways to do things. In some cases, perhaps understanding things will be easier with the addition of the new for syntax for ranges or the auto return type in a function declaration. I think that overall, C++ will become easier to learn and use while at the same time becoming easier to teach.

Mastering a language is a long-term goal, it can not be done over night. It's silly to think that one can have mastery over something as complex as C++ quickly. It takes practice, experience and debugging code to really hammer something in. Academically learning is one thing, but putting to use that knowledge is an entire different monster. I think that if one already has mastery of the C++ language, the new concepts will not pose too much of a burden, but a new comer may have an advantage in that they won't bother learning some of the more obsolete ways of doing things.

Mike Caron
In effect uniform initialization, auto, ... are things that a novice will learn as a "normal" part of the language...
Gian Paolo Ghilardi
"People will still learn about pointers and how they work, but they'll also learn about smart pointers and how they're managed." - the new school of teaching C++ is not to teach pointers :)
Piotr Dobrogost
+3  A: 

For me, one of the most important, will be:

unique_ptr + std::move() !

Imagine:

  1. Smart pointer without any overhead:

    • no reference counting operations
    • no additional storage for reference counter variable
  2. Smart pointer that can be moved, ie. no destructor/constructor calls when moved

What does this give you? Exception safe, cheap (pointers..) containers without any costs. The container will be able to just memcpy() unique_ptrs, so there will be no performance loss caused by wrapping regular pointer by smart pointer! So, once again:

  1. You can use pointers
  2. It will be safe (no memory leaks)
  3. It will cost you nothing
  4. You will be able to store them in containers, and they will be able to do "massive" moves (memcpy-like) with them cheaply.
  5. It will be exception safe

:)

Another point of view:

  1. Actually, when you move group of objects using copy(), there is constructor and destructor call for every object instance. When you copy 1000 objects of 1kb size, there will be at least one memcpy() and 2000 function calls.
  2. If you would want to avoid the thousands of calls, you would have to use pointers.
  3. But pointers are: dangerous, etc. Actual smart pointers will not help you, they solve other problems.
  4. There is no solution for now. You must pay for C++ RAII/pointer/valuevars design from time to time. But with C++0x, using unique_ptr will allow to do "massive" moves of objects (yes, practically objects, because pointer will be smart) without "massive" constructor/destructor calls, and without risk of using pointers! For me, this is really important.

It's like relaxing the RAII concept (because of using pointers) without loosing RAII benefits. Another aspect: pointer wrapped in unique_ptr() will behave in many aspects similar to java reference object variable. The difference is that unique_ptr() will be able to exist in only one scope at a time.

Totally! That is a really, really cool feature.
Mike Caron
+2  A: 

You have a point, but it's always been the case. There is a lot of C++ code out there that still doesn't incorporate anything from the '98 standard just because of the innate conservatism of some coders. Some of us remember a dark time before the std:: namespace (before namespaces, in fact), when everyone wrote their own string class, and pointers walked around naked all the time. There is a reason why we talk about "modern C++ style" - to distinguish from the earlier style because some people still have to maintain or update code in that style.

Any language has to evolve to survive, and any language that evolves will have a divided user base, if only because people vary in their attitude towards estimating opportunity costs in applying new language features to their own work.

With the advent of C++0x in shipping compilers, this conversation will be played out over and over in dev teams across the world:

YOUNGSTER: I've just discovered these things called lambdas! And I'm finding lots of ways to use them to make our code more expressive! Look, I rewrote your old Foo class, isn't that much neater?

OLDSTER: There was nothing wrong with my old Foo class. You're just looking for excuses to use a "cool" new feature unnecessarily. Why do you keep trying to make my life so complicated? Why do I keep having to learn new things? We need another war, that's what we need.

YOUNGSTER: You're just too stuck in your ways, old man, we shouldn't even be using C++ these days... if it was up to me -

OLDSTER: If it was up to me we'd have stuck with PL/1, but no... my wife had to vote for Carter and now we're stuck with all this object-oriented crap. There's nothing you can do with std::transform and lambdas that I can't do with a goto and a couple of labels.

etc.

Daniel Earwicker