Chapter 01

前置き

dec9ue
dec9ue
2021.12.18に更新

Modern C++宣言

ModernC++を書く前に言っておきたい事がある
かなり厳しい話もするが俺の本音を聴いておけ

new/deleteは(直接)呼んではいけない
生ポインタも使ってはいけない

auto推論を使え、範囲forを使え
できる範囲で構わないから

忘れてくれるな
所有権を理解しない者に
まともなコードは書けないことを

お前にはお前しか
できない事もあるから
細かいことはライブラリに任せて
ロジックの実現に集中しろ

意訳:

Modern C++は21世紀に入ってから改善されてきたC++言語の仕様を指します。これまでのC++(C++03以前)の概念から、より明快な意味論を持つように改善されていることが特徴です。

Modern C++ではこれまで多用されてきた new / delete などのハンドコードによるメモリ管理が基本的に排除され、スコープとスマートポインタの概念で基本的なアロケーションの管理ができるようになっています。また、アロケーションの管理だけでなく、よりシンプルに記述できる構文規則を採用することで、実現したいロジックをより簡潔に表現できるようになっています。

ただし、この恩恵を受けるためには「明快な意味論」であるところのムーブセマンティクスをある程度理解している必要があります。

何をするか?

このガイドは主にこれまで、なんとなくC++ の構文を知ってたり、レガシーなC++なら読み書きできる人(ここでは単に短く「おっさん」と呼ぶ)が、モダンで実用的なC++アプリケーションコードをかけるようにするためのModern C++クイックスタートガイドを提供します。

ライブラリ利用者の立ち位置から簡潔な記述でアプリケーションコードを書けるレベルを目指します。基本的に、大胆不敵に説明し、大枠を掴んでリテラシーを確立することを目的にします。細かいところが間違っていても、後で調べてわかりゃそれでいいじゃないですか。

以降、本ガイドの内容についてもう少し説明します。(かったるそうだなと思ったらセクションの終わりまで読み飛ばしてもらっても大丈夫です。)

  • 主にムーブセマンティクスの直感的理解と変数/関数の宣言における必勝パターンの把握を目指します。
    • このガイド内での説明のほとんどをこれに割きます。
    • これをある程度理解ししていれば、あとは些末だと言っても過言ではありません。
  • 高速化その他の特殊な事情でデフォルトのメモリアロケーション機構を置き換えるなどの発展的な利用法については触れません。
  • 自分でテンプレートを書くレベルまで到達することは想定しません。
    • つまり次のような言葉は過去に耳にしていても一旦忘れろってことです。これらの概念はテンプレート書かない段階では基本的に関係ないです。
      • 完全転送
      • ユニバーサル参照
      • 参照圧縮
  • ライブラリ利用者の立ち位置でアプリケーションコードを書くという前提から、ある程度理解しておくべき事項を補足します。

言語仕様のベースは基本的にC++14からC++17くらいを想定します。これもだいたいの目安です。基本、だいたい、です。

対象のおっさんであることの確認

だいたい、次のことがある程度自分で説明できるか、事前に確認しておきましょう。

  • 式と文
  • 型定義
  • 例外
  • 参照、const 参照、ポインタ
  • struct / class / 可視性
  • 関数オーバーロード
  • インスタンス / new / delete
  • コンストラクタ(デフォルトコンストラクタ、コピーコンストラクタ)、デストラクタ
  • 配列
  • 継承、virtual 関数、オーバーライド
  • テンプレート(テンプレートについてあまり深入りしませんが、vector くらいは使えることを想定します)

ちなみに、上記の内容に不安がある場合、このガイドを読むより、C++の一般的な教本を読んだほうが効率がいいかもしれません。