新しいリテラル表現

nullptr (C++11)

C++11には、 ヌルポインタ を 表現 する キーワード として nullptr が 追加 さ れ て い ます。 nullptr は std::nullptr_t 型 の リテラル です。 C ++ 03 以前 は、 ヌルポインタ を 表現 する ため に NULL マクロ や 0 を 用い て き まし た。 NULL マクロ は、 置換 結果 の 値 も 型 も 実装 依存 とさ れ て い ます が、 通常 は 整数型 の 0 です。

before (C++98/ 03)
#include < iostream >
struct Data { // 省略 }; 
const Data* GetDataPtr( int id) { 
 std::cout << "int" << std::endl; 
 return NULL; 
} 
const Data* GetDataPtr( const char* name) { 
 std::cout << "const char*" << std::endl; 
 return NULL; 
} 
int main() { 
 const Data* p = NULL; // ヌルポインタ
 p = GetDataPtr( NULL); // (恐らく 意図 せ ず) int 型 バージョン が 呼ば れる 
 if (p == NULL) { // ヌルポインタ か どう か 判定 
  std::cout << "null" << std::endl; 
 } 
}

実行結果: int null

after (C++11/ 14/ 17)
#include < iostream > 
struct Data { // 省略 }; 
const Data* GetDataPtr( int id){ 
 std::cout << "int" << std::endl; 
 return nullptr; 
} 
const Data* GetDataPtr( const char* name) { 
 std::cout << "const char*" << std::endl; 
 return nullptr; 
} 
int main() { 
 const Data* p = nullptr; // ヌルポインタ 
 p = GetDataPtr(nullptr); // const char* 型 バージョン が 呼ば れる 
 if (p == nullptr) { // ヌルポインタ か どう か 判定 
  std:: cout << "null" << std:: endl; 
 } 
}

実行結果: const char* null

生文字列リテラル(C++11)

生文字列リテラル は、 エスケープ シーケンス を 無視 し て、 記述 通り に 文字列 を 解釈 さ せる 記法 です。生文字列リテラル の 記法 は、 次 の よう に なっ て い ます。

R"()"

この ( ) の 内側 に 書い た 文字列 は、 記述 通り に 解釈 さ れる よう になり ます。 先頭 の「 R」 は「 Raw」 の 略 です。 何となく、( ) が “” の 外側 に ある 方 が 自然 な 気 が する かも しれ ませ ん が、 正しい のは “()” です。 なお、 ワイド 文字列 を 表す L の よう な 接頭辞 も 付加 でき ます。 これ は「 R」 の 手前 に 付け ます。

LR"( abcde)"

従来 の 記法 で、 5 行 から なる 文字列 リテラル を 記述 する と、 例えば、” abc\ ndef\ nghi\ njkl\ nmlo\ n” の よう に \n を 挟み込む 必要 が あり ます。 生 文字列 リテラル を 使う と、 文字通り「 改行」 を 行え ば、 改行 として 認識 さ れ ます。

#include < iostream > 
int main(){ 
 const char s[] = R"( abc 
 def 
 ghi 
 jkl 
 mno)"; 
 std::cout << s << std::endl; 
}

実行 結果:

abc

def

ghi

jkl

mno

数値リテラルの桁区切り文字(C++14)

C++14 に なっ て、 整数 リテラル や 浮動小数点数 リテラル の 任意 の 位置 に「’」 を 入れる こと が 許さ れる よう になり まし た。 これ は 読み やす さを 向上 さ せる ため の 機能 です。

#include < iostream >
int main() { 
 long long int n = 12' 345' 678' 900' 000; 
 double f = 12. 345' 678; 
 std::cout << n << std::endl; 
 std::cout << f << std::endl; 
}

実行結果: 12345678900000 12. 3457

使う 文字 は 変え られ ませ ん が、 入れる 位置 は どこ でも 構い ませ ん。 3 桁 ごと の コンマ「,」 の つもり で 使っ ても いい です し、 2 桁 ごと や 4 桁 ごと に 入れる 方 が 分かり やすい とき は、 その よう に し ても 構い ませ ん。

before (C++98/ 03 および C++11)
int main() { 
 int money = 100000000; 
 int x = 0xa8c4aa26; 
 double fp = 45897.5675068479; 
}
after (C++14/ 17)
int main() { 
 int money = 100'000'000; 
 int x = 0xa8c4'aa26; 
 double fp = 45'897.567'506'847'9; 
}

2進数リテラル (C++14)

従来 から、 整数 リテラル は、 10 進数、 8 進数、 16 進数 で 表記 する こと が でき まし た が、 C ++ 14 に なっ て、 2 進数 の 整数 リテラル が 表記 できる よう になり まし た。 プリフィックス( 接頭辞) は「 0b」 または「 0B」 です。

#include < iostream > 
int main() { 
 unsigned int bits = 0b1011; // 10進数 で 11 
 std::cout << bits << std::endl; 
}

実行 結果: 11

コメント

タイトルとURLをコピーしました