新しいC ++ 14機能の概要:パート2

今回は、最初の部分よりもはるかに少ない革新があります。 それでも、C ++ 14は重要なリリースではないと見なされ、新しい機能を導入するよりもC ++ 11の欠点を解消することを目的としています。



短いリスト:



新しいC ++ 14機能の概要:パート1

現在のドラフト標準





言語自体の変更



特定のサイズの空きメモリ



C ++ 11では、プログラマーは、削除されたオブジェクトのサイズをパラメーターとして取るoperator delete



クラスの静的メソッドを定義できます。 現在、対応するグローバルdelete



演算子が標準に追加されています。 この変更は、最新のメモリアロケータのパフォーマンスを改善するように設計されています。



追加された演算子には、次のシグネチャがあります。

 void operator delete(void* ptr, std::size_t size) noexcept; void operator delete(void* ptr, std::size_t size, const std::nothrow_t&) noexcept; void operator delete[](void* ptr, std::size_t size) noexcept; void operator delete[](void* ptr, std::size_t size, const std::nothrow_t&) noexcept;
      
      





ここで発生した主な互換性の問題は、メモリ割り当て用の新しいシステムと古いユーザーライブラリが使用される場合です。 新しいプログラムでは、サイズを受け入れない演算子の呼び出しはユーザーライブラリにルーティングされ、サイズのある呼び出しはシステムライブラリにルーティングされます。 現時点では、サイズを持つ演算子の標準的な動作は、サイズなしで対応する演算子を呼び出すことなので、これまでのところ問題はありません。生産性を高めたいユーザーは、対応するバージョンの演算子を追加する必要があります。 ただし、標準の将来のバージョンでは、この動作を変更する予定です。 このようにして、委員会は、予期しない問題を回避するために、プログラマにメモリアロケータを適応させる時間を与えます。



デジタル区切り文字としての単一引用符



これで、単一引用符を使用して数字の順序を区切ることができます。 たとえば、 0x10'0000



、および0'004'000'000



は同じ意味です。

ただし、この変更により次の問題が発生します。

まず、マクロ拡張機能の動作が変更されます。 例:

 #define M(x, ...) __VA_ARGS__ int x[2] = { M(1'2,3'4) }; // C++11: int x[2] = {}; // Now: int x[2] = { 3'4 };
      
      





そして第二に、構文を強調するように設計された多くのエディターやその他のユーティリティは、コードを誤って解析するようになりました。 Habrahabrでさえ抵抗することはできませんでした:

 int testing_habrahabr_syntax_highlighter = 1000;
      
      





 int testing_habrahabr_syntax_highlighter = 1'000;
      
      





 int testing_habrahabr_syntax_highlighter = 1'000'000;
      
      





 int testing_habrahabr_syntax_highlighter = 1'0'0'0'0'0'0;
      
      





属性[[deprecated]]





C ++ 11では、以前はgcc / clangの__attribute__およびVC ++の__declspecと呼ばれていた属性を宣言するための構文が標準化されました。 C ++ 14では、次のトークンのいずれかをマークできる属性が追加されました:クラス、変数、非静的クラスメンバー、関数、列挙、テンプレートの特殊化、またはtypedef-何らかの理由でそれらのさらなる使用が望ましくない場合、非推奨として。 その結果、プログラマーがこの属性でマークされたトークンを使用すると、コンパイラーは警告を発行します。 オプションの属性パラメーターを使用すると、追加のメッセージ(たとえば、適切な置換の提案)を指定できます。このメッセージは、コンパイラーの警告とともに表示されます。

 void foo(); [[deprecated("use 'foo' instead")]] void bar();
      
      





たとえば、開発チームがサードパーティのライブラリの一部の機能を使用できないようにする場合、この属性を使用してトークンを再宣言できますが、再宣言してこの属性のアクションを削除することはできません。

 #include <GL/gl.h> [[deprecated("use 'glDrawArrays' instead")]] void glBegin(GLenum);
      
      





STL開発者の裁量により、C ++標準(互換性機能)の付録Dで指定されているすべての適格なトークンにこの属性を付けることができます。



標準ライブラリの変更



std::complex



カスタムリテラル



虚数部のみで構成される複素数をすばやく作成するために、次のリテラルが追加されました。

 namespace std { inline namespace literals { inline namespace complex_literals { constexpr complex<long double> operator""il(long double); constexpr complex<long double> operator""il(unsigned long long); constexpr complex<double> operator""i(long double); constexpr complex<double> operator""i(unsigned long long); constexpr complex<float> operator""if(long double); constexpr complex<float> operator""if(unsigned long long); }}}
      
      





その結果、通常の算術演算で複雑な数値を簡単かつ簡単に作成できます。

 using namespace std; complex<double> a = 1.5 + 0.3i; auto b = 2.3 - 0.2i;
      
      





技術仕様



画像

画像に示されているように、2011年まで委員会は「モノリシック」モデルを使用していました。このモデルでは、すべての新しい機能が唯一のドラフト標準になりました。

2012年以降、委員会はより「分散」モデルに移行しました。標準開発の主な方向は、標準とは独立して独自の速度で行われ、準備が整い次第発行されます。しばらくして彼と合併しました。 このモデルにより、委員会は作品をより速く、より予測可能な方法で小さな部分で一般に公開することができます。 また、標準自体の新しいバージョンのリリースを高速化する必要があります。



現時点では、Boost.Filesystem v3に基づくファイルシステムを操作するためのAPI技術仕様のドラフト(ファイルとディレクトリの反復を含む)が既に承認されています。



以下の仕様が積極的に開発されています。

  1. ネットワーキングTS。 現在含まれているもの:

    • POSIX標準の関数htonl(), htons(), ntohl(), ntohs()



      基づいて、ネットワーク(ビッグエンディアン)とローカルマシンで使用されるバイトオーダー間のバイト順序を変換する関数。 すでに委員会によって承認されています。
    • URIを操作するためのAPI 。 委員会による承認をまだ待っています。
  2. Library Fundamentals TS:標準ライブラリの主要部分の拡張セットです。 optional<>



    およびその他の改訂用の基本ユーティリティが作成されました。
  3. 配列拡張TS:配列に関連する言語およびライブラリの拡張。 dynarray<>



    runtime-sized arrays



    dynarray<>



    は、ここで改訂のために作成されました。
  4. 並行性TS:最初は、executorとschedulerのサポート、および.then()



    .when_*()



    などのstd::future



    非ブロッキング操作の
    サポートが含まれています。 後で、 await



    などの言語拡張、および並列ハッシュコンテナーなどのライブラリ拡張をここに追加できます。
  5. 並列処理の拡張機能:最初は、複数のプロセッサコアを使用する並列アルゴリズムをサポートする並列STLライブラリと、プロセッサ命令セットの全機能を使用するベクトル化可能なアルゴリズムが含まれています。


すべての技術仕様は、 std::experimental



名前空間を使用しています。



グラフィックチームも最近、「2D Lite」描画APIの標準化に着手しました。 グラフィックスとC ++の小さな議論は、 ここの 42:30から始まるGoingNative2013でのCoat of Arms of Sutterのプレゼンテーションにあります



おわりに



委員会の次の会議は2014年2月に予定されています。 その後、次の候補であるC ++ 14標準(C ++ 1yとも呼ばれる)のリリースとある程度の類似性が得られます。

最近のレポートによると、ClangとSVNのlibc ++がすでに標準の現在のドラフトを完全に実装しているため、GCCはやや遅れています。 ここで確認できます: Clanglibc ++GCC



新しいC ++ 14機能の概要:パート1

現在のドラフト標準



PS swap



演算子



標準化に関する他のすべての提案の中で、昨年の春には、C ++で特別な交換演算子を導入する提案がありました:=:標準ライブラリstd::swap



機能を置き換えます。 その後、エイプリルフールのジョークと思われた人もいましたが、8月末に提案がバージョン2に更新されました。この演算子に関する委員会の意見はまだわかりませんが、標準化はまだ承認されていません。 詳細はこちらをご覧ください



All Articles