Flat Leon Works

アプリやゲームを作ってます。

【C++】C++14勉強メモ

C++11のお勉強」に続いて、C++14のお勉強です。

注意

  • 個人的な勉強メモです
  • 筆者はC++11/C++14のコードをまだ全然書いたことないです
  • 的はずれなことを書いているかもしれません
  • わかったことがあったら追記していきます

2進数リテラル

  • 0b0011みたいな書き方ができるようになる
  • ビットをフラグのように使う場合、1<<2みたいな書き方をしていたけど、これからは0b0010のように書いた方が分かりやすいかも

参考リンク : 2進数リテラル - cpprefjp C++日本語リファレンス

通常関数での戻り値型の型推論

  • ラムダ式にあった戻り値の型推論を通常の関数でも利用できるようにしたもの?
  • 戻り値型をautoにしておき、return文からコンパイラに推論させることができる
  • 複数のreturn文がある場合は共有の型が推論される。かしこい

参考リンク : 通常関数の戻り値型推論 - cpprefjp C++日本語リファレンス

decltype(auto)

  • decltype(auto)を使うことでdecltype(式)より簡潔に書くことができる
  • ちなみに、decltype(auto)(decltype(式))とautoの違いは、式が参照だった場合、参照型になるかどうか(autoは参照が解除される)

参考リンク : decltype(auto) - cpprefjp C++日本語リファレンス

後置き戻り値型でのauto

  • 後置き戻り値型でautoが利用できるようになる
  • この記法はラムダ式のために導入された(通常関数でautoを利用したければ前置きにすれば良いので)
    • ラムダ式では戻り値型を省略できるので後置き戻り値型でautoを利用できるようになるメリットはなさそうに見えるが、auto&という記述ができるようになるというメリットがある。つまり型推論を利用しつつ参照型で返せるようになる

ラムダ式の初期化キャプチャ

  • キャプチャ方法を式として記述できる機能
  • 今までのキャプチャを初期化キャプチャで記述すると以下のような感じ?
    • コピーキャプチャ : [a](){return a;} -> [a=a](){return a;}
    • 参照キャプチャ : [&a](){return a;} -> [&a=a](){return a;}
  • この方法を使うことで、別名としてキャプチャすることも可能になった
    • 例 : [apple=a](){return apple;}

参考リンク : ラムダ式の初期化キャプチャ - cpprefjp C++日本語リファレンス

ジェネリックラムダ

  • ラムダ式の引数にテンプレートを利用できるようにしたもの
  • ラムダ式の引数型をautoにすると、ジェネリックラムダになり、任意の型の引数での呼び出しができるようになる
  • ラムダ式の実体である関数オブジェクトのoperator()が関数テンプレートになっていると考えると分かりやすい

参考リンク : ジェネリックラムダ - cpprefjp C++日本語リファレンス

変数テンプレート

  • 関数テンプレート、クラステンプレートの変数版
  • ()なしで関数テンプレートの呼び出しなどが可能になる機能という見方もできる

参考リンク : 変数テンプレート - cpprefjp C++日本語リファレンス

constexprの制限緩和

  • C++11でのconstexprにはreturn文1つのみ、変数書き換え禁止など大きな制限があったが、C++14で大幅に緩和された
  • ほぼ普通の関数と同じような記述が可能になった印象

参考リンク : constexprの制限緩和 - cpprefjp C++日本語リファレンス

deprecated属性

  • 属性構文にdeprecatedが追加され、関数やクラスを非推奨だと明記できるようになった
  • 非推奨な関数やクラスを使うとコンパイラにより警告がでる

参考リンク : [[deprecated]]属性 - cpprefjp C++日本語リファレンス

数値リテラルの桁区切り文字

  • 123'456'789のように数値に桁区切りを入れられるようになった
  • 0b1111'1111のように2進数記法でも利用可能

参考リンク : 数値リテラルの桁区切り文字 - cpprefjp C++日本語リファレンス