This page is a very rough attempt to create a guide to the new features of C++09 for people already familiar with c++03. It is based on n2606.pdf

TODO:

  • Research the unknowns.
  • Mention the type-generic header inclusion.
  • Other headers added like the wchar header.

C99 Compatibility

edit

Boolean Datatypes

edit

C99 has a _Bool datatype that is generally used via the 'bool' macro (as well as true and false macros) found in <stdbool.h>. These definitions are compatible with the c++ keywords bool, true, and false.

Therefore, the C++0x standard adds a <stdbool.h> and <cstdbool> headers for compatibility. These headers simply define the __bool_true_false_are_defined macro as per the C99 standard.

The C++0x standard does not include the _Bool keyword. This does not hurt compatibility significantly, as few C programs use that keyword directly.

Complex Numbers

edit

TODO

C99 Preprocessor additions

edit

C++0x supports the _pragma keyword from C99. It also includes support for variable-length argument macros using __VA_ARGS__ (like in C99). I've not yet determined if it supports empty macro arguments or VARGS macros.

<stdint.h>

edit

C++0x includes <stdint.h> of C99, as well as a <cstdint> header, with the typedefs in the std namespace.

long long ints

edit

C++9x includes the C99 'long long datatype (as well as the more explicit long long int), as well as it's unsigned variation. It also includes the relevant additions to <limits.h> and <climits>. However, _Longlong and _ULonglong marcos/typedefs required by C++03TR1 are not included in C++0x. I'm not sure if c++0x includes the new type specifiers for printf and scanf.

__func__

edit

C99's __func__ predefined value is present, containing an implementation defined string.

Trailing comma in enums

edit

C99 Unclear features

edit

Array Parameter Qualifier

edit

It is not clear to me if the array parameter qualifier feature of C99 is in C++0x. For example:

void myfuncc(int t[const])

or

void baz(char s[static 10])

Compound literals

edit

I've yet to determine if C++0x supports C99's compound literals.

Designated initializers

edit

I've yet to determine if C++0x supports C99's designated initializers.

Variable Length Arrays

edit

I've yet to determine if C++0x supports C99's variable length arrays.


Flexible Array Member (struct hack)

edit

I've yet to determine if C++0x supports C99's Flexible array member feature.

restrict

edit

I've yet to determine if C++0x supports C99's restrict feature.

C99 Features not included in C++0x

edit

Hexadecimal floating-point literals

edit

Why not?

One could almost implement this as a user-defined literal, but not quite. That seems odd to me.

New Features

edit

angle bracket fix

edit

typeof improvements

edit

explicit conversion operators

edit

constexpr

edit

Type Determinism

edit

TODO:

  • Explain uses
  • Provide examples

If a variable is declared with a specific initialization, it may use the specifier auto without a type specifier, and the compiler will determine the type of the right hand side of the initialization, and use that as the type.

There is a new pseudo-function keyword decltype, it takes as an argument an expression. It determines the type of the expression result at compile time. It functions as though it were replaced with the correct type specification for the result type of the expression. (CHECKME: I think it can be used where ever a type name can be used).

concepts

edit

intialization lists

edit

uniform initialization

edit

range based for loops

edit

lambda expressions/functions

edit

alternative function syntax

edit

function construction delegation

edit

nullptr

edit

To fix the issue of NULL being both an integer and a pointer type, and to make the name even clearer, there is a new keyword nullptr. It designates a constant r-value of a new unnamed datatype. (The datatype can have a name, but it must be using an implementation reserved name, or be otherwise inaccessible, such as defined in an unnamed namespace.) It is effectively a simple POD struct with implicit conversion operators to any pointer or pointer to member datatype. (Either by templated member functions, or by compiler magic.) While it is not expected to be very useful, the <cstddef> header will contain a new typedef of the form typedef decltype(nullptr) nullptr_t; or equivalent.

explicit default (de)constructors

edit

enum class

edit

Variadic templates

edit

templated typedefs

edit

nested functions

edit

user defined literals

edit

static assertions

edit