2009-10-01

C++0x: 2009-09 pre-Santa-Cruz

2009-09 pre-Santa-Cruz mailingが公開された。

ここから各ペーパーを個別にダウンロードできる。認証に通る人は、zipでひとまとめにして落とせる。何故公開されているドキュメントをまとめて落とすのに認証がいるのかは分からない。

最新のワーキングドラフトは、N2960となった。最大の変更点は、もちろん、Conceptがばっさりと削除されていることだ。そのほか、size()がO(1)になっただとか、n2928: Explicit Virtual Function Overrides(ドラフトの新しく追加された7.6.5を参照されたし)だとかも、興味深い。

あとは、あまり気付きにくい、細かい変更だ。N2924だとか、N2933は、より「自然」になるような変更だ。クラスが参照などを含んでいてコピーできなかったら、デフォルトのコピーコンストラクタは生成されないとか、attributeにvariadic templateのtemplate parameter packを使えるようにするというような内容だ。

しかし、N2930: Range-Based For Loop Wording (Without Concepts)は、あまり歓迎できない。某巨大掲示板で、「きったない服で通学することになりテンションガタ落ち中」と書かれていたのも、さることぞかし。

そのほかにも、細かな変更点は数々あるが、N2961: Editor's Reportに詳しく載っているので、それを参照してもらいたい。

今回のペーパーで、個人的に気になるのは、以下の通り。

N2947: Additional Type-Traits for C++0x
type traitsライブラリに、is_trivially_copyable, is_literal_type, is_explicitly_convertible, enum_base、というメタ関数を追加。enum_baseは邪道だと思う。所謂、enumの本来の型を明らかにするメタ関数である。それによって、enum型と整数型の間を、安全にキャストできるようになる。邪道だ。そういう場合には、enumを使うべきではないと信ずる。

N2965: Type traits and base classes
これはなかなか興味深い。すべてのベースクラスを返すbasesというメタ関数と、直接のベースクラスを返す、direct_basesというメタ関数を追加する。名前から見て分かるように、複数形である。このメタ関数は、そのベースクラスの型をすべて含む、tupleを返す。つまり、

class E {};
class D {};
class C : virtual public D, private E {};
class B : virtual public D, public E {};
class A : public B, public C {};


// ベースクラスをすべて返す。
bases<A>::type ; // 型は、tuple<D, B, E, C, E>

// 直接のベースクラスのみ返す。
direct_bases<A>::type ; // 型は、tuple<B, C>

N2971: Core issue 743: decltype(...) name qualifiers
delctypeをnested-name-specifierで使えるようにする変更。簡単に言うと、delctype(T)::typeということができるようになる。
これは、日本から送った意見だ。だからどうということはないのだが。何を隠そう、信仰と勇気で有名なあの人が発見した問題だったはずだ。

N2978: Core issue 789: Replacing Trigraphs
トライグラフを黒歴史にしてしまおうという壮大なる野望。日本人のプログラマの九割九分九厘までは、トライグラフなど消しても差し支えあるまいと思っているだろうが、一度決められたことを、無かったことにするのは、C++では難しい。

ところで、Santa-Cruz meetingは、10月の19日から24日にかけて行われる。

2 comments:

redboltz said...

19と20日に参加してくる予定です。
海外での会議参加は初で、英語的にも技術的にもどこまでついて行けるか不安ではありますが。

enum_baseに関しては、悪しきプログラミングスタイルを助長する可能性がありそうですね。
まだPaper読んでないので、Motivationなどを読み込んでみたいと思います。

江添亮 said...

参加するのですか。いいですね。

enum_baseには、まだ救いがあります。
これが本質的に邪悪だと気がつかないレベルの人間に、メタプログラミングが理解できて、このメタ関数を活用できるかどうか。

それに、enumと整数の間の変換が必要な場合も、残念ながら、数多くあるのです。
C++以外の他言語と同時に使う場合とか。