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:
Post a Comment