5月8日、Bjarne Stroustrup氏が「Stroustrup: C++ Style and Technique FAQ」と題した記事を公開した。この記事では、C++の父である同氏が開発者から寄せられる技術的な質問に答える包括的なFAQについて詳しく紹介されている。以下に、その内容を紹介する。
C++の生みの親による実践的なFAQ集
この記事は、C++言語の設計者であるBjarne Stroustrup氏が、長年にわたって開発者から寄せられた質問を体系的にまとめたものだ。2022年2月26日に更新されており、現代のC++開発における重要なトピックを網羅している。
Stroustrup氏は冒頭で、このFAQは教科書や仕様書の代替品ではなく、あくまで質問と回答の集合体であることを明記している。また、C++ Core Guidelinesや統一されたisocpp.org C++ FAQへの貢献も進めているため、このFAQの更新頻度は今後減る可能性があると述べている。
最も実用的な「シンプルなプログラム」の書き方
FAQの中で特に興味深いのは、「この非常にシンプルなプログラムをどう書けばよいか?」という質問への回答だ。Stroustrup氏は、学期の始めに頻繁に寄せられるこの質問に対し、実際に動作するサンプルコードを提示している。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<double> v;
double d;
while(cin>>d) v.push_back(d); // read elements
if (!cin.eof()) { // check if input failed
cerr << "format error\n";
return 1; // error return
}
cout << "read " << v.size() << " elements\n";
reverse(v.begin(),v.end());
cout << "elements in reverse order:\n";
for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n';
return 0; // success return
}
このコードについて、Stroustrup氏は以下の重要なポイントを強調している:
- メモリ管理が不要:vectorが自動的にメモリを管理するため、明示的な割り当て・解放が必要ない
- バッファオーバーフローの回避:標準vectorを使用することで、任意のバッファをオーバーフローさせる心配がない
- 初心者には配列は危険:「配列を使って愚かなエラーを犯さずに読み込むことは、完全な初心者の能力を超えている」と断言している
8つのカテゴリで構成される包括的な内容
FAQは以下の8つの主要カテゴリに分類されている:
- Getting started(入門)
- Classes(クラス)
- Class hierarchies(クラス階層)
- Templates and generic programming(テンプレートとジェネリックプログラミング)
- Memory(メモリ管理)
- Exceptions(例外処理)
- Other language features(その他の言語機能)
- Trivia and style(トリビアとスタイル)
各カテゴリには、実際の開発で頻繁に遭遇する具体的な質問が並んでいる。例えば、「なぜ空のクラスのサイズは0ではないのか?」「なぜC++にはfinalキーワードがないのか?」「メモリリークにどう対処するか?」といった、実践的な疑問への回答が含まれている。
C++ Core Guidelinesを推奨するコーディング規約
コーディング規約に関する質問では、Stroustrup氏は**C++ Core Guidelinesを明確に推奨**している。これは「C++を完全に型安全でリソース安全な言語として、パフォーマンスを損なうことや冗長性を追加することなく使用する」ことを目的とした野心的なプロジェクトだ。
同氏は、「特定の目的と環境におけるC++の使用ルールを提供することがC++コーディング規約の主要な目的」であり、「すべての用途とすべてのユーザーに対応する単一のコーディング規約は存在し得ない」と述べている。また、「悪いコーディング規約は、コーディング規約がないよりも悪い」という警告も発している。
Stroustrup氏は、C言語のコーディング規約や10年前のC++コーディング規約の使用を避けるよう強く推奨しており、現代的なC++の特性を活かした規約の重要性を強調している。
詳細はStroustrup: C++ Style and Technique FAQを参照していただきたい。