コンテンツにスキップ

Home

本講義は『独習C++ 新版』でC++17を勉強する人に向けて、C++20/23の機能を補足するものです。 したがって、本講義の1章を読む場合は『独習C++ 新版』の1章を読み終えていることを前提としています。

C++20で言語機能の大幅な変更があったため、C++17とC++20では大きな違いがあります。C++23では言語機能には大きな変更はなく、ライブラリ機能の追加が大きいと言えるでしょう。

テンプレートメタプログラミングの理解は必須なのか?

C++03の時点でテンプレートのチューリング完全性が見つかったあと、C++11はメタプログラミングを言語機能としてサポートし、標準ライブラリが強力なメタプログラミングによって設計されるようになりました。そして多数のメタプログラミングをサポートする標準ライブラリが導入されるにいたりました。C++17以降は特定の言語機能を悪用したメタプログラミングではなく言語機能にシンタックスシュガーを導入して行く流れとなり、意味不明なコードを書かなくともメタプログラミングが可能となりました。今日、一部のテンプレートメタプログラミングはもはや玄人専用ではなくなりました。

Modern C++ を習得するためにメタプログラミングを理解する必要はありませんが、テンプレートをある程度理解しなければなりません。あなたがテンプレートを用いて設計を行うかどうかに関係なく、利用する標準ライブラリはほぼすべてがテンプレートを用いて設計されてるからです。テンプレートにまつわる仕様を理解していなければ、エラーメッセージを理解することは不可能です

C++事情について二言三言

  • コンパイラが複数ある
    • C++にはコンパイラが複数あり、プロダクションで使われているのは MSVC/Clang/GCC/ICC (Intel C++ Compiler) の 4 つでしょう
    • ISO/IEC 14882 において国際標準規格が定められており、各コンパイラがそれに従って実装されています
    • 規格を読む必要はありませんが、専門用語を覚える必要があります、なぜならばエラーメッセージは容赦なく専門用語を連発してくるからです
  • C言語との互換性があります
    • C++はC言語との互換性があるように規格である程度は定められています
    • とはいえ、完全に互換性があるわけではありません
  • ビルドツールは混沌とし、パッケージマネージャはデファクトスタンダードになっているものがありません
    • JavaScript界隈もびっくりの混沌です
    • 本講義で採用するのは CMake + vcpkg