2010-03-30

post-Pittsburgh mailingの簡易レビュー

post-Pittsburgh mailingが公開された。

最新のWorkind Draftは、N3090となった。また、FCDが、N3092として、公開された。中身は、ドラフトとほぼ同じである。これで、後は、修正ぐらいしかできない。がしかし、ひょっとしたら、またもう一度、FCDを出すかもしれない。いずれにせよ、C++0xの規格は、2011年内に、制定されるだろう。

N3047: Fixing is_constructible and is_explicitly_convertible

is_constructibleを、is_explicitly_convertibleと同等にする提案。その結果、is_explicitly_convertibleは、廃止される。

N3048: Defining Swappable Requirements

Swappable Requirementsの追加。言語機能としてのconceptが廃止されたので、概念として定義する必要がある。

N3049: Core issues 743 and 950: Additional decltype(...) uses (revision 1)

decltypeを、より、「型」として使えるようにするための修正。

N3050: Allowing Move Constructors to Throw (Rev. 1)

ライブラリのMoveコンストラクタのrequirementsで、throwを禁止しているが、これをやめる。moveコンストラクタ内からthrowして欲しくない場合は、std::move_if_noexceptw()を使う。

N3051: Deprecating Exception Specifications

例外指定をdeprecateにする。例外指定は、現実では、まったく意味がなかった。例えば、テンプレートが絡むと、明示的に投げる可能性のある例外を指定するなどということは、不可能になってしまう。

ただし、いくつかのコンパイラでは、何も指定しない、throw()を、関数は例外を投げないという指定とみなして、そのような最適化をしている。そこで、noexceptというキーワードを、新たに導入して、「この関数は例外を投げないと保証できる」と宣言出来るようにした。

互換性のために、nothrow()は、noexcept(true)と、同じシグネチャになる。

// noexceptと、noexcept(true)と、throw()は、同じシグネチャとして、認識される。
void trust_me() noexcept ;
void trust_me() noexcept(true) ;
void trust_me() throw() ;

// noexcept(false)と、throw(...)は、同じシグネチャとして、認識される。
void I_will_throw() noexcept(false) ;
void I_will_throw() throw(std::exception) ;

// 例外指定のない関数は、noexcept(false)やthrow(...)とは、違うシグネチャとして、認識される。
void dunno() ;

ちなみに、noexcept、noexcpt(true)、throw()と指定された関数が、もし、例外を投げた場合、std::terminate()が呼ばれる。こう規定することには、ひと議論あった。しかし、この指定はそもそも、例外を投げないという保証を、ユーザーが宣言するのである。例外を投げた場合、どうなろうと、知った事ではない。ユーザーの責任である。

ではなぜ、undefined behaviorではないのか。undefined behaviorでは、ポータブルなコードを書くことができない。たとえば、最適化の結果として、オブジェクトのデストラクタなどが呼ばれず、例外が関数外に送出されるということが起こり得る。これは、セキュリティ上、非常にまずい。

また、std::terminate()を呼び出すと規定しても、パフォーマンス上の影響はないと、その場にいた実装者は、全員同意した。meetingの後に、gccの実装者が、MLで、gccの現状の実装では、コストは全くないとはいい切れないと訂正したが、では、実際に目に見えるコストがかかるかどうかは、その実装者としても、断言できないそうだ。というわけで、コストは、ほぼない。

N3052: Converting Lambdas to Function Pointers

キャプチャリストが空のlambda式を、関数ポインタに変換出来るようにする提案。

void (* ptr )( int ) = [](int) {} ;

N3053: Defining Move Special Member Functions

データメンバーが、すべてmovableであった場合、moveコンストラクタを自動的に定義しようという提案。

N3055: A Taxonomy of Expression Value Categories

lvalueとrvalueを細分化してカテゴリ分けする。詳細は、本の虫: N3055: A Taxonomy of Expression Value Categoriesを参照されたし。

N3056: Conceptless Random Number Generation in C++0X, version 2

乱数ライブラリから、conceptの名残を取り除く提案。

3057: Explicit Initializers for Atomics

atomicオブジェクトのメモリオーダーなどを、明示的に指定して初期化出来るようにする提案。

N3058: Futures and Async Cleanup (Rev.)

futureとasyncライブラリに対する、雑多な細かい修正。

N3059: Proposal to Simplify pair (rev 5.2)

息の長い、pairを単純化しようという提案。

N3060: Extensions to the C++ Library to Support Mathematical Special Functions

C99の数学用の関数を、C++に取り入れる提案。誰が使うのだろう。

N3062: Core issue 789: Fixing Raw Strings wrt. Trigraphs (revision 1)

トライグラフの大半を、規格から削除する。IBMが使っているトライグラフだけは、互換性のために、残す。

N3063: Core issue 968: Disambiguating [[ (revision 1)

attributeと、lambda式、配列とで、文法が曖昧になる。今までの規格では、[[というトークンは、すべてattributeとして解釈するという文面だったが、問題なので、修正する。

以下のようなコードが、問題になる。

int x[10] ;

// x[1] = 0 と同じ。
x[[](){ return 1 ; }()] = 0 ;

N3064: Core issue 374: Explicit specialization outside a template's parent (revision 1)

名前空間の外側で、明示的な特殊化を許可する。

  namespace NS1 {
    template<class T>
    class CDoor {
    public:
      int mtd() { return 1; }
    };
  }
  template<> int NS1::CDoor<char>::mtd()
  {
    return 0;
  }

N3065: Removing Export

exportの廃止。deprecateではなく、完全な削除。ただし、exportというキーワードは、予約語として残す。exportの経緯については、Stroustrup: HOPL-3を参照されたし。よくまとまっている。

N3066: Iterators in C++0x

conceptの研究で得られた成果を、イテレーターに反映させる。

N3067: Core issue 951: Various Attribute Issues (revision 1)

attributeに対する、細かな変更。

N3068: Equality Comparison for Unordered Containers (Rev 2)

unorderedコンテナ同士を、同じかどうか、比較出来るようにする。

N3069: Various threads issues in the library (LWG 1151) (revised)

スレッド間のライブラリの利用における、いくつかの問題を解決。たとえば、複数のスレッドから、ひとつのストリームを読み書きした場合、同期されるのかどうかなど。

N3070 - Handling Detached Threads and thread_local Variables

detachされたスレッドの、thread_local変数のデストラクターが走るタイミングと同期に関する問題の解決。

N3071: Renaming launch::any and what asyncs really might be (Rev.)

名前の通り。launch::anyという名前を、launch::sync_or_asyncに変更する。

N3072: Harmonizing Effects and Returns Elements in Clause 21

stringライブラリの文面が間違っているので、それを修正。

N3073: pecifying Pointer-Like Requirements (Revision 1)

名前通り。ポインターのように振舞う型というrequirementsを定義する。

3074: Updates to C++ Memory Model Based on Formalization

同期まわりの文面の修正。

N3077: Alternative approach to Raw String issues

Raw string literalが、大幅に変わる。

まず、"[...]"ではなく、"(...)"という形に変わる。さらに、Raw string literalは、本当に、Rawになる。つまり、UCNのエスケープシーケンスや、トライグラフ、プリプロセッサの、行末に\を指定することによる、改行の削除の影響すら、受けなくなる。

char const * ptr = R"delimiter(\u1234
\
)delimiter" ;

これは、従来の文字列リテラルでは、

"\\u1234\n\\\n"

と同じである。つまり、UCNも気にしなくていいし、プリプロセッサによる改行の削除の影響も、気にしなくてよくなる。ついに、本当の意味でRawになった。

N3078: Allowing constexpr for reference parameters

constexprな関数の仮引数に、参照を使えるようになった。

constexpr int f( int const & value )
{
    return value ;
}

N3079: Redrafting: issues 667, 861, 990, 818

Issue 667, Issue 990, Issue 818, Issues 861, 919, 920、への解決策。例えば、issue 818については、本の虫: こんな変更ありかよを参照されたし。

No comments: