「C++11 コア言語」のフリー版 オンラインドキュメント|上級者向け

この記事は約22分で読めます。

近頃は C++ のお勉強をしています。組込みでなく GNU/Linux 上で動かすためのです。その中で、ステキなオンラインドキュメントを見かけたのでご紹介です。

さて、C++ といえば、C言語ユーザから見ると「は?正気か・・・?」というレベルの言語仕様の複雑さで有名です。コンパイラを作る側が追いつかないレベルの複雑さです。C言語でいうバイブル プログラミング言語C 第2版 ANSI規格準拠 に相当する C++ のバイブル プログラミング言語C++第4版 は、約1000ページあります。書店に行って手に取ってもらうと分かりますが、普通に撲殺できるレベルです。この本が特別なのではなく、他の本でもだいたい撲殺できます。

さて、その撲殺シリーズの中でもひときわ異彩を放っている本がこちらです。

「コア言語の詳細を不必要なまでに解説!」という漢気溢れるキャッチーな表紙がステキです。みんながいかに複雑怪奇なC++をわかりやすく解説するか頑張っているところに殴り込みをかけるかのごとくの煽り文です。不必要までに、て……

公開場所は 著者 江添亮さんの GitHub です。かなりの難易度、ボリュームです。不必要なまでにC++ マニアになりたい方は是非挑戦してみてください!

C++11: Syntax and Feature

どのような内容かわかるように、参考までに目次だけ抜粋しておきます。

以上、C++大好きっ子のためのフリードキュメントのご紹介でした!

  • 1 概要(General)
  • 1.1 C++とは
  • 1.2 用語(Definitions)
  • 1.2.1 実引数(argument)と、仮引数(parameter)
  • 1.2.2 静的な型(static type)と、動的な型(dynamic type)
  • 1.2.3 シグネチャー(signature)
  • 1.2.4 ill-formedプログラムと、well-formedプログラム
  • 1.2.5 実装可能な機能(conditionally-supported)
  • 1.2.6 実装定義の動作(implementation-defined behavior)
  • 1.2.7 未定義の動作(undefined behavior)
  • 1.2.8 未規定の動作(unspecified behavior)
  • 1.3 文法記法(Syntax notation)
  • 1.4 C++メモリーモデル(The C++ memory model)
  • 1.5 C++オブジェクトモデル(The C++ object model)
  • 1.6 プログラムの実行(Program execution)
  • 2 字句規約(Lexical conventions)
  • 2.1 翻訳単位(Separate translation)
  • 2.2 ソースファイルの変換(Phase of translation)
  • 2.3 文字セット(Character sets)
  • 2.3.1 基本ソース文字セット
  • 2.3.2 ユニバーサル文字名
  • 2.4 トークン(Tokens)
  • 2.5 コメント(Comments)
  • 2.6 識別子(Identifiers)
  • 2.6.1 予約語
  • 2.7 キーワード(Keywords)
  • 2.8 リテラル(Literals)
  • 2.8.1 整数リテラル(Integer literals)
  • 2.8.2 浮動小数点数リテラル(Floating literals)
  • 2.8.3 文字リテラル(Character literals)
  • 2.8.3.1 エスケープシーケンス
  • 2.8.4 文字列リテラル(String literals)
  • 2.8.4.1 エンコード方式
  • 2.8.4.2 文字列リテラルの型の要素数
  • 2.8.4.3 生文字列リテラル(Raw String Literal)
  • 2.8.5 boolリテラル(Boolean literals)
  • 2.8.6 ポインターリテラル(Pointer Literals)
  • 2.8.7 ユーザー定義リテラル(User-defined literals)
  • 3 基本事項(Basic concepts)
  • 3.1 宣言と定義(Declarations and definitions)
  • 3.1.1 宣言(Declaration)と定義(Definition)の違い
  • 3.1.2 定義ではない宣言
  • 3.2 ODR(One definition rule)
  • 3.3 スコープ(Scope)
  • 3.3.1 宣言領域とスコープ(Declarative regions and scopes)
  • 3.3.2 宣言場所(Point of declaration)
  • 3.3.3 ブロックスコープ(Block scope)
  • 3.3.4 関数プロトタイプのスコープ(Function prototype scope)
  • 3.3.5 関数のスコープ(Function scope)
  • 3.3.6 名前空間のスコープ(Namespace scope)
  • 3.3.6.1 グローバル名前空間(Global namespace)
  • 3.3.7 クラスのスコープ(Class scope)
  • 3.3.8 enumのスコープ(Enumeration scope)
  • 3.3.9 テンプレート仮引数のスコープ(Template Parameter Scope)
  • 3.3.10 名前隠し(Name hiding)
  • 3.4 名前探索(Name lookup)
  • 3.4.1 Qualified 名前探索(Qualified name lookup)
  • 3.4.2 Unqualified 名前探索(Unqualified name lookup)
  • 3.4.3 ADL(Argument-dependent name lookup)
  • 3.4.3.1 関連クラスと関連名前空間
  • 3.4.3.2 ADLが適用される条件
  • 3.5 プログラムとリンケージ(Program and linkage)
  • 3.6 プログラムの開始と終了(Start and termination)
  • 3.6.1 main関数(Main function)
  • 3.6.2 非ローカル変数の初期化(Initialization of non-local objects)
  • 3.6.3 終了(Termination)
  • 3.7 ストレージ(storage duration)
  • 3.7.1 確保関数(allocation function)
  • 3.7.2 解放関数(deallocation function)
  • 3.7.3 安全なポインター(Safely-derived pointers)
  • 3.7.4 サブオブジェクトの有効期間
  • 3.8 オブジェクトの寿命(Object lifetime)
  • 3.9 型(Types)
  • 3.9.1 基本型(Fundamental types)
  • 3.9.2 複合型(Compound types)
  • 3.9.3 CV修飾子(CV-qualifiers)
  • 3.9.4 lvalueとrvalue(Lvalues and rvalues)
  • 3.9.5 アライメント(Alignment)
  • 4 標準型変換(Standard conversions)
  • 4.1 lvalueからrvalueへの型変換(Lvalue-to-rvalue conversion)
  • 4.2 配列からポインターへの型変換(Array-to-pointer conversion)
  • 4.3 関数からポインターへの型変換(Function-to-pointer conversion)
  • 4.4 CV修飾子の型変換(Qualification conversions)
  • 4.5 整数の変換順位(Integer conversion rank)
  • 4.6 整数のプロモーション(Integral promotions)
  • 4.7 整数の型変換(Integral conversions)
  • 4.8 浮動小数点数のプロモーション(Floating point promotion)
  • 4.9 浮動小数点数の型変換(Floating point conversions)
  • 4.10 浮動小数点数と整数の間の型変換(Floating-integral conversions)
  • 4.11 ポインターの型変換(Pointer conversions)
  • 4.12 メンバーへのポインターの型変換(Pointer to member conversions)
  • 4.13 boolの型変換(Boolean conversions)
  • 5 式(Expressions)
  • 5.1 優先順位と評価順序
  • 5.2 未評価オペランド(unevaluated operand)
  • 5.3 一次式(Primary expressions)
  • 5.3.1 :: 演算子
  • 5.3.2 括弧式(parenthesized expression)
  • 5.4 ラムダ式(Lambda expressions)
  • 5.4.1 ラムダ式の基本的な使い方
  • 5.4.1.1 変数のキャプチャー
  • 5.4.2 ラムダ式の詳細
  • 5.4.2.1 クロージャーオブジェクト(closure object)
  • 5.4.3 thisのキャプチャー
  • 5.4.4 パラメーターパックのキャプチャー
  • 5.5 後置式(Postfix expressions)
  • 5.5.1 添字(Subscripting)
  • 5.5.2 関数呼び出し(Function call)
  • 5.5.3 関数形式の明示的型変換(Explicit type conversion (functional notation))
  • 5.5.4 疑似デストラクター呼び出し(Pseudo destructor call)
  • 5.5.5 クラスメンバーアクセス(Class member access)
  • 5.5.6 インクリメントとデクリメント(Increment and decrement)
  • 5.5.7 Dynamic cast(Dynamic cast)
  • 5.5.8 型識別(Type identification)
  • 5.5.9 Static cast(Static cast)
  • 5.5.10 Reinterpret cast
  • 5.5.11 Const cast
  • 5.6 単項式(Unary expressions)
  • 5.6.1 単項演算子(Unary operators)
  • 5.6.1.1 * 演算子と& 演算子
  • 5.6.1.2 単項演算子の+と-
  • 5.6.1.3 ! 演算子
  • 5.6.1.4 ~ 演算子
  • 5.6.2 インクリメントとデクリメント(Increment and decrement)
  • 5.6.3 sizeof(Sizeof)
  • 5.6.4 new
  • 5.6.5 delete
  • 5.6.6 alignof
  • 5.6.7 noexcept演算子(noexcept operator)
  • 5.7 キャスト形式による明示的型変換(Explicit type conversion (cast notation))
  • 5.8 メンバーへのポインター演算子(Pointer-to-member operators)
  • 5.9 乗除算の演算子(Multiplicative operators)
  • 5.10 加減算の演算子(Additive operators)
  • 5.11 シフト演算子(Shift operators)
  • 5.12 関係演算子(Relational operators)
  • 5.13 等価演算子(Equality operators)
  • 5.14 ビット列論理積演算子(Bitwise AND operator)
  • 5.15 ビット列排他的論理和演算子(Bitwise exclusive OR operator)
  • 5.16 ビット列論理和演算子(Bitwise inclusive OR operator)
  • 5.17 論理積演算子(Logical AND operator)
  • 5.18 論理和演算子(Logical OR operator)
  • 5.19 条件演算子(Conditional operator)
  • 5.20 代入と複合代入演算子(Assignment and compound assignment operators)
  • 5.21 コンマ演算子(Comma operator)
  • 5.22 定数式(Constant expressions)
  • 6 文(Statements)
  • 6.1 ラベル文(Labeled statement)
  • 6.2 式文(Expression statement)
  • 6.3 複合文、ブロック(Compound statement or block)
  • 6.4 選択文(Selection statements)
  • 6.4.1 if文(The if statement)
  • 6.4.2 switch文(The switch statement)
  • 6.5 繰り返し文(Iteration statements)
  • 6.5.1 while文(The while statement)
  • 6.5.2 do文(The do statement)
  • 6.5.3 for文(The for statement)
  • 6.5.4 range-based for文(The range-based for statement)
  • 6.5.4.1 range-based forの基本
  • 6.5.4.2 range-based forの詳細
  • 6.5.5 ジャンプ文(Jump statements)
  • 6.5.5.1 break文(The break statement)
  • 6.5.5.2 continue文(The continue statement)
  • 6.5.5.3 return文(The return statement)
  • 6.5.5.4 goto文(The goto statement)
  • 6.6 宣言文(Declaration statement)
  • 6.7 曖昧解決(Ambiguity resolution)
  • 7 宣言(Declarations)
  • 7.1 単純宣言(simple-declaration)
  • 7.2 static_assert宣言(static_assert-declaration)
  • 7.3 指定子(Specifiers)
  • 7.3.1 ストレージクラス指定子(Storage class specifiers)
  • 7.3.1.1 register指定子
  • 7.3.1.2 thread_local指定子
  • 7.3.1.3 static指定子
  • 7.3.1.4 extern指定子
  • 7.3.1.5 mutable指定子
  • 7.3.2 関数指定子(Function specifiers)
  • 7.3.2.1 inline指定子
  • 7.3.2.2 virtual指定子
  • 7.3.2.3 explicit指定子
  • 7.3.3 typedef指定子(The typedef specifier)
  • 7.3.4 friend指定子(The friend specifier)
  • 7.3.5 constexpr指定子(The constexpr specifier)
  • 7.3.6 型指定子(Type specifiers)
  • 7.3.6.1 CV修飾子(The cv-qualifiers)
  • 7.3.6.2 単純型指定子(Simple type specifiers)
  • 7.3.6.3 複雑型指定子(Elaborated type specifiers)
  • 7.3.6.4 auto指定子(auto specifier)
  • 7.3.6.5 decltype指定子(decltype specifier)
  • 7.4 enumの宣言(Enumeration declarations)
  • 7.4.1 unscoped enum
  • 7.4.2 scoped enum
  • 7.4.3 enum基底(enum-base)
  • 7.4.4 enum宣言(opaque-enum-declaration)
  • 7.5 名前空間(Namespaces)
  • 7.5.1 名前空間の定義(Namespace definition)
  • 7.5.1.1 inline名前空間
  • 7.5.1.2 無名名前空間(Unnamed namespaces)
  • 7.5.1.3 名前空間のメンバーの定義(Namespace member definitions)
  • 7.5.2 名前空間エイリアス(Namespace alias)
  • 7.5.3 using宣言(The using declaration)
  • 7.5.4 usingディレクティブ(Using directive)
  • 7.6 リンケージ指定(Linkage specifications)
  • 7.7 アトリビュート(Attributes)
  • 7.7.1 アライメント指定子(alignment specifier)
  • 7.7.2 noreturnアトリビュート(Noreturn attribute)
  • 8 宣言子(Declarators)
  • 8.1 型名(Type names)
  • 8.2 曖昧解決(Ambiguity resolution)
  • 8.3 宣言子の意味(Meaning of declarators)
  • 8.3.1 ポインター(Pointers)
  • 8.3.2 リファレンス(References)
  • 8.3.3 メンバーへのポインター(Pointers to members)
  • 8.3.4 配列(Arrays)
  • 8.3.5 関数(Functions)
  • 8.3.6 デフォルト実引数(Default arguments)
  • 8.4 関数の定義(Function definitions)
  • 8.4.1 default定義(Explicitly-defaulted functions)
  • 8.4.2 delete定義(Deleted definitions)
  • 8.5 初期化子(Initializers)
  • 8.5.1 ゼロ初期化(zero-initialize)
  • 8.5.2 デフォルト初期化(default-initialize)
  • 8.5.3 値初期化(value-initialize)
  • 8.5.4 アグリゲート(Aggregates)
  • 8.5.5 文字配列(Character arrays)
  • 8.5.6 リファレンス(References)
  • 8.5.7 リスト初期化(List-initialization)
  • 9 クラス(Classes)
  • 9.1 トリビアルにコピー可能なクラス(trivially copyable class)
  • 9.2 トリビアルクラス(trivial class)
  • 9.3 標準レイアウトクラス(standard-layout class)
  • 9.4 POD構造体(POD struct)
  • 9.5 クラス名(Class names)
  • 9.6 クラスのメンバー(Class members)
  • 9.6.1 レイアウト互換(layout-compatible)
  • 9.7 メンバー関数(Member functions)
  • 9.7.1 非staticメンバー関数(Nonstatic member functions)
  • 9.7.2 thisポインター(The this pointer)
  • 9.8 staticメンバー(Static members)
  • 9.8.1 staticメンバー関数(Static member functions)
  • 9.8.2 staticデータメンバー(Static data members)
  • 9.9 union(Unions)
  • 9.9.1 無名union(anonymous union)
  • 9.9.2 共用メンバー(variant member)
  • 9.10 ビットフィールド(Bit-fields)
  • 9.11 クラス宣言のネスト(Nested class declarations)
  • 9.12 ローカルクラス宣言(Local class declarations)
  • 9.13 型名のネスト(Nested type names)
  • 10 派生クラス(Derived classes)
  • 10.1 複数の基本クラス(Multiple base classes)
  • 10.2 メンバーの名前探索(Member name lookup)
  • 10.3 virtual関数(Virtual functions)
  • 10.4 アブストラクトクラス(Abstract classes)
  • 11 メンバーのアクセス指定(Member access control)
  • 11.1 アクセス指定子(Access specifiers)
  • 11.2 基本クラスと、基本クラスのメンバーへのアクセス指定(Accessibility of base classes and base class members)
  • 11.3 friend(Friends)
  • 11.4 protectedメンバーアクセス(Protected member access)
  • 11.5 virtual関数へのアクセス(Access to virtual functions)
  • 11.6 複数のアクセス(Multiple access)
  • 11.7 ネストされたクラス(Nested classes)
  • 12 特別なメンバー関数(Special member functions)
  • 12.1 コンストラクター(Constructors)
  • 12.2 一時オブジェクト(Temporary objects)
  • 12.3 型変換(Conversions)
  • 12.3.1 コンストラクターによる型変換(Conversion by constructor)
  • 12.3.2 型変換関数(Conversion functions)
  • 12.4 デストラクター(Destructors)
  • 12.5 フリーストア(Free store)
  • 12.6 初期化(Initialization)
  • 12.6.1 明示的な初期化(Explicit initialization)
  • 12.6.2 基本クラスとデータメンバーの初期化(Initializing bases and members)
  • 12.6.2.1 コンストラクターのデリゲート
  • 12.7 生成と破棄(Construction and destruction)
  • 12.8 クラスのコピーとムーブ
  • 12.9 コンストラクター継承(Inheriting constructors)
  • 13 オーバーロード(Overloading)
  • 13.1 オーバーロード可能な宣言(Overloadable declarations)
  • 13.2 オーバーロードのその他の注意事項
  • 13.3 オーバーロード解決(Overload resolution)
  • 13.3.1 候補関数(Candidate functions)
  • 13.3.1.1 関数呼び出しの文法(Function call syntax)
  • 13.3.1.2 式中の演算子(Operators in expressions)
  • 13.3.1.3 コンストラクターによる初期化(Initialization by constructor)
  • 13.3.1.4 ユーザー定義型変換によるクラスのコピー初期化(Copy-initialization of class by user-defined conversion)
  • 13.3.1.5 変換関数によるクラスではないオブジェクトの初期化(Initialization by conversion function)
  • 13.3.1.6 変換関数によるリファレンスの初期化(Initialization by conversion function for direct reference binding)
  • 13.3.1.7 リスト初期化による初期化(Initialization by list-initialization)
  • 13.4 適切関数(Viable functions)
  • 13.5 最適関数(Best viable function)
  • 13.5.1 暗黙の型変換の順序(Implicit conversion sequences)
  • 13.5.1.1 標準型変換(Standard conversion sequences)
  • 13.6 オーバーロード関数のアドレス(Address of overloaded function)
  • 13.7 オーバーロード演算子(Overloaded operators)
  • 13.7.1 単項演算子(Unary operators)
  • 13.7.2 二項演算子(Binary operators)
  • 13.7.3 代入(Assignment)
  • 13.7.4 関数呼び出し(Function call)
  • 13.7.5 添字(Subscripting)
  • 13.7.6 クラスメンバーアクセス(Class member access)
  • 13.7.7 インクリメントとデクリメント(Increment and decrement)
  • 13.7.8 確保関数と解放関数(allocation function and deallocation function)
  • 13.7.9 ユーザー定義リテラル
  • 14 テンプレート(Templates)
  • 14.1 テンプレート仮引数/実引数(Template parameters/arguments)
  • 14.1.1 型テンプレート仮引数/実引数
  • 14.1.2 非型テンプレート仮引数/実引数
  • 14.1.3 テンプレートテンプレート仮引数/実引数
  • 14.1.4 デフォルトテンプレート実引数
  • 14.1.5 可変テンプレート仮引数
  • 14.2 テンプレート特殊化の名前(Names of template specializations )
  • 14.3 型の同一性(Type equivalence)
  • 14.4 テンプレート宣言(Template declarations)
  • 14.4.1 クラステンプレート(Class templates)
  • 14.4.2 メンバーテンプレート(Member Templates)
  • 14.4.3 可変引数テンプレート(Variadic Templates)
  • 14.4.3.1 可変引数テンプレートの使い方
  • 14.4.4 friend
  • 14.4.5 クラステンプレートの部分的特殊化(Class template partial specializations)
  • 14.4.5.1 クラステンプレートの部分的特殊化の一致度の比較(Matching of class template partial specializations)
  • 14.4.5.2 クラステンプレートの部分的特殊化の半順序(Partial ordering of class template specializations)
  • 14.4.5.3 クラステンプレートの特殊化のメンバー
  • 14.4.6 関数テンプレート(Function templates)
  • 14.4.7 関数テンプレートのオーバーロード(Function Template Overloading)
  • 14.4.8 関数テンプレートの部分的特殊化(Partial ordering of function templates)
  • 14.4.9 エイリアステンプレート(Alias templates)
  • 14.5 名前解決(Name Resolution)
  • 14.5.1 依存(Dependent)
  • 14.5.2 非依存名の名前解決
  • 14.5.3 依存名の名前解決
  • 14.6 テンプレートの実体化と特殊化(Template instantiation and specialization)
  • 14.6.1 暗黙の実体化(Implicit instantiation)
  • 14.6.2 明示的実体化(Explicit instantiation)
  • 14.6.3 明示的特殊化(Explicit specialization)
  • 14.7 関数テンプレートの特殊化(Function template specializations)
  • 14.7.1 明示的なテンプレート実引数指定(explicit template argument specification)
  • 14.7.2 テンプレートの実引数推定(Template argument deduction)
  • 14.7.3 半順序(partial ordering)
  • 15 例外(Exception handling)
  • 15.1 例外を投げる(Throwing an exception)
  • 15.2 コンストラクターとデストラクター(Constructors and destructors)
  • 15.3 例外の捕捉(Handling an exception)
  • 15.4 例外指定(Exception specifications)
以下、著者の GitHub の ReadMe より抜粋です。買いましょう!

本書は紙の本と達人出版の電子書籍で購入できる。
購入すると、筆者が自由な参考書の執筆に使える時間が増える。

筆者について

名前:江添亮
Mail : boostcpp@gmail.com
Blog : http://cpplover.blogspot.jp/

コメント