C ++ 11-削除および廃止予定



誰もがすでに新しいC ++ 11標準のリリースを認識しています;Habréには、その機能に関するいくつかの記事がすでにありました。 しかし、新しいバージョンでC ++から除外されたものと、その理由を説明することにしました。 新機能ほど重要ではないように見えるかもしれませんが、彼らが言うように:「歴史を知らない人は間違いを繰り返す運命にあります。」



動的な例外仕様



おそらく、関数を宣言するときに、この関数が生成する例外のタイプを指定できることをご存じでしょう。 さて、このようなもの:

int A() throw(); //     int B() throw(A,B); //   A  B int (); //    
      
      





そして、それは見えるだろう-すべてがうまくいきますが、実際にのみ:

  1. 関数Aは例外をスローできます
  2. 関数Bは任意の例外をスローできます
  3. 関数Cは何も生成しない場合があります。
これがなぜそうなのか誰が気にしているのか- この記事はこちらで読むことができる。 関数Aの構文がまったく直感的ではないという事実についてはすでに沈黙しています。最初に見たとき、関数Aだけが例外をスローできると判断しました。 さらに、一部のコンパイラ(Microsoft Visual C ++など)は、関数Bのスタイルの宣言について気にしません-チェックは実行されず、その警告は正直に警告されます。



この混乱はすべて取り除かれ、「noexcept」というキーワードが1つ追加されました。これは、関数が例外をスローできないことを説明しています。 それだけです。



auto_ptr



ある種のスマートポインタは、C ++での存在を喜ばせません。 auto_ptrは削除されました。 auto_ptrのアイデアは良かったのですが、実際にはドキュメントを絶対に読まないことが判明しました。 また、auto_ptrを犠牲にして、たとえばSTLコレクションでは使用できないことが明確に述べられていますが、誰もが常にそれを行っています。 そして最悪なのは、それがあいまいな結果につながったことです。 たとえば、次のようなコードがあります。

 vector<auto_ptr<int> > vi; //..populate vi sort(vi.begin(), vi.end(), indirect_less());
      
      





コンパイラ、OS、STLバージョン、およびムーンフェイズによっては、動作する場合も動作しない場合もあり、クラッシュする場合もあります。 C ++標準化委員会は、心に訴えることを切望し、auto_ptrをunique_ptrに置き換えました。これは、auto_ptrの問題で、非常に特定の方法で動作します。 これは非常に望ましい行動であることに誰もが同意すると思います。



「継承のポイント」の概念



「i ++ + ++ iはいくらでしょうか?」という質問のファンは、常に興味のあるポイントをスキルでたどることが好きでした。 以前は、C ++標準はシーケンス操作である操作とそうでない操作を決定していました。 基本的に何も変わっていませんが、概念は廃止されました。 とにかく、すべての操作は、特定のアクションのシーケンスを保証するものと保証しないものに分けられます。 現在、彼らは単に「操作はシーケンシャル」または「操作はシーケンシャルではない」と言います。 この変更は、新しいメモリモデルの標準化を単純化するという幻想的な希望(それが何なのか)によって説明されています。 それは私には思える-嘘。 「次のポイント」がどういうわけか非常に複雑に聞こえただけです。 :)



エクスポートテンプレート



この機能を知っている人や使用している人はほとんどいないと思います。 以下に例を示します。

 // File 1: #include <stdio.h> static void trace() { printf("File 1\n"); } // declaration only export template <class T> T const& min(T const&, T const&); int main() { trace(); return min(2, 3); } // File 2: #include <stdio.h> static void trace() { printf("File 2\n"); } //The definition export template <class T> T const& min(T const &a, T const &b) { trace(); return a<b ? a : b; }
      
      





テンプレート関数は1つのファイルで宣言され、別のファイルで実装され、ファイルには相互に含まれず、それぞれに独自のバージョンのtrace()関数があることに注意してください。 このトピックの詳細については、 こちらをご覧ください 。 Edison Design Groupは、何年も前に、この機能を標準に追加することを主張しました。 彼らにとって非常に重要であるように思われ、独自のコンパイラで実装を行いましたが、彼ら以外は誰もそれをしませんでした(たとえば、開発はBorlandによって使用されました)。 時間が経ち、EDGはそれらが間違っていることを認めました。 テンプレートのエクスポートは、C ++ 11標準から削除されました。



新しい標準を学ぶ皆さんに幸運を祈ります。この記事が誰かに役立つなら、私はとてもうれしいです。



All Articles