2010-09-23

あやうくアグリゲートにとんでもない嘘を書くところだった

すべての配列はアグリゲートである。ところが、今執筆しているC++本で、ふと気がついたら、何を間違えたか、

アグリゲート(aggregate)とは、配列かクラスでユーザー定義のコンストラクター、非staticデータメンバーの初期化子、privateおよびprotectedな非staticデータメンバー、基本クラス、virtual関数が存在しないものをいう。

などと書いていた。これでは、配列にも、ユーザー定義のコンストラクター云々といった条件が課されるように読めてしまう。危ないところだった。このままでは、日本トンデモ本大賞を受賞してしまう。配列は、たとえアグリゲートではないクラスの配列型であったとしても、アグリゲートである。

しかし、一般に、あまりアグリゲートではないクラスの配列をリスト初期化した覚えはない。例えば、以下のようには書かない。

std::string a[] = { "hello", "fake silly C++", "world" } ;

そもそも考えて見れば、ここ数年は、配列を積極的に使った覚えはない。私は普通、以下のように書く。

std::vector< std::string > v = { "hello", "truly awesome C++", "world" } ;

No comments: