京都C++勉強会の宣伝のために、C++03とC++11の違いを、少しづつ解説することにした。
江添とボレロ村上の京都C++勉強会が、12月16日に行われる。これを書いている時点では、まだ空きがあるので、最新のC++14の新機能と、コンパイル時レイトレーシングを勉強したければ、ATNDで参加申し込みをせよ。
江添とボレロ村上の京都C++勉強会 | 集客ならイベントアテンド
C++11の新しい文字列リテラル
C++11では、新しい文字列リテラルが導入された。特に、その文字列リテラルのプレフィクス、R, u8, u8R, u, uR, U, UR, LRは、C++03では合法なプログラムで違法になるものがある。例えば、そのような名前をマクロを使っていた場合だ。
#define u8 "abc" // C++03では"abcdef" // C++11では"def" const char * ptr = u8"def" ;
このことからもわかるように、Cプリプロセッサーマクロは危険であり、使ってはならない。
C++11のユーザー定義リテラル
C++11では、ユーザー定義リテラルが導入された。これにより、C++03で合法なプログラムで違法になるものがある。たとえば、ユーザー定義リテラルの場所でマクロを使った場合だ。
#define _x "def" // C++03では"abcdef" // C++11では、ユーザー定義リテラル "abc"_x ;
このことからもわかるように、Cプリプロセッサーマクロは危険であり、使ってはならない。
C++11の新しいキーワード
C++11では、以下の新しいキーワードが導入された。
alignas, alignof, char16_t, char32_t, constexpr, decltype, noexcept, nullptr, static_assert, thread_local
これらのキーワードは、C++03ではキーワードではないので、当然、以下のようなコードを記述することができた。
// C++03では合法 // C++11では違法 int alignas = 0 ;
たまたま新しいキーワードを使っていた既存のコードは、C++03では合法だが、C++11では違法になる。
C++では、標準化にあたって、既存のコードで慣習的によく使われている名前をキーワードとすることは避けている。そのため、通常はこれらの新しいキーワードと既存のコードが衝突することはないだろう。
整数の型
C++では、サフィックスを用いていない整数リテラルの型は、その値によって変わる。もし値がint型で表現できない場合long int型、符号付き整数型で表現できない場合、符号なし整数型になる。
C++11では、C99との互換性のため、long long intを取り入れた。このため、C++03では、unsigned long型になっていた整数リテラルが、C++11では、signed long long int型になる可能性がある。
江添とボレロ村上の京都C++勉強会が、12月16日に行われる。これを書いている時点では、まだ空きがあるので、最新のC++14の新機能と、コンパイル時レイトレーシングを勉強したければ、ATNDで参加申し込みをせよ。
No comments:
Post a Comment