メインコンテンツ

Polyspace でサポートされる C++17 言語の要素

次の表には、C++17 以降に導入された C++ 言語の要素と、対応する Polyspace® サポートの部分的なリストを示しています。サポートされていない設定がコードに含まれている場合、Polyspace ではコンパイル エラーがレポートされます。

C++17 標準参照説明サポートあり
C++2017-N3921std::string-view:リソースを所有せずに std::string オブジェクトの内容を参照するはい
C++2017-N3922
  • 初期化子リストの要素が同一の型である場合、コピーリスト初期化を使用すると auto で型が std::initializer_list であると推測されます。それ以外の場合、auto による推測は不適格になります。

  • 単一要素を含む中かっこで囲んだ初期化子リストで直接リスト初期化を使用すると、auto によってその要素から型が推測されます。

  • 複数要素を含む中かっこで囲んだ初期化子リストで直接リスト初期化を使用すると、auto による型の推測は不適格になります。

はい
C++2017-N3928static_assert 宣言は第 2 引数を必要としなくなりました。次のようなメッセージなしの static_assert 呼び出しが許可されるようになりました。static_assert(N > 0);はい
C++2017-N4051

C++ が、引数としてテンプレートを取るテンプレートなど、class 以外のテンプレートをサポートするようになりました。以前はそのようなテンプレート - テンプレート パラメーターの宣言には class キーワードが必要でした。C++17 ではテンプレート - テンプレート パラメーターの宣言時に typename を次のように使用できます。

template <template <typename> typename Tmpl> struct X;
はい
C++2017-N4086C++17 以降、3 文字表記はサポートされなくなりました。いいえ
C++2017-N4230

C++17 以降、複数の入れ子になった名前空間を一度に定義するには、名前空間定義で修飾名を使用します。たとえば、次のコードの抜粋は等価です。

  • namespace base::derived{
    //..
    }
  • namespace {
        namespace derived{
            //...
        }
    }

はい
C++2017-N4259C++17 で関数 std::uncaught_exceptions が導入されました。これにより、コード内で処理されなかった例外の数が返されます。ブール値を返す関数 std:uncaught_exception は廃止されました。はい
C++2017-N4266C++17 以降、名前空間と列挙子に属性で注釈を付けることにより、開発者の意図をより明確に伝達できるようになりました。はい
C++2017-N4267C++17 以降、接頭辞 u8 がサポートされるようになりました。この接頭辞は UTF-8 文字リテラルを作成します。コード ポイント値が C0 制御文字および基本ラテン文字 Unicode ブロックにある場合、UTF-8 文字リテラルの値は ISO 10646 コード ポイント値と等価です。 はい
C++2017-N4268非型テンプレート引数の定数評価を使用できます。はい
C++2017-N4295畳み込み式が使用可能 はい
C++2017-N4508タイムアウトのない std::shared_mutex が使用可能 std::shared_mutex を使用してもコンパイル エラーは発生しません。Polyspace は std::shared_mutex を使用する共有ミューテックス オブジェクトをサポートしません。
C++2017-P0001R1 register キーワードの使用を停止 はい
C++2017-P0002R1operator++(bool) を削除 はい
C++2017-P0003R5 廃止された throw(<>) を使用した例外指定を削除 Bug Finder では、throw() ステートメントを使用して指定される例外指定が削除されました。Code Prover では、throw() ステートメントが C++17 コードに存在するとコンパイル エラーが発生します。
C++2017-P0012R1例外指定が型システムの一部になった はい
C++2017-P0017R1 クラスの初期化が基底クラスと統合 はい
C++2017-P0018R3 ラムダ式でポインター *this のキャプチャが使用可能はい
C++2017-P0024R2並列性拡張のための C++ 技術仕様の標準化Polyspace は、Visual 15.x および Intel C++ 18.0 の各コンパイラを使用している場合にこの機能をサポートします。
C++2017-P002842反復なしの属性名前空間の使用はい
C++2017-P0035R4オーバーアライン データに対する動的メモリ割り当てはい
C++2017-P0036R0単項の畳み込み式と空のパラメーター パックはい
C++2017-P0061R1 プリプロセッサの条件での __has_include の使用 はい
C++2017-P0067R5 基本的な文字列変換 いいえ
C++2017-P0083R3マップとセットの挿入Polyspace では、使用しているコンパイラもこの機能をサポートしている場合にこの機能をサポートします。たとえば、コンパイラに g++ を使用している場合、Polyspace はこの機能をサポートします。
C++2017-P0088R3std::variant部分的にサポート。
C++2017-P0091R3 クラス テンプレートでのテンプレート引数推測 部分的にサポート。
C++2017-P0127R2auto 型の非型テンプレート パラメーターはい
C++2017-P0135R1コピー省略の保証 部分的にサポート。
C++2017-P0136R1 継承コンストラクターの新仕様いいえ
C++2017-P0137R1 参照メンバーを含むクラス オブジェクトの置き換え はい
C++2017-P0138R2 列挙型の直接リスト初期化 はい
C++2017-P0145R3 厳密な式の評価順 新しい構文やキーワードは導入されていないため、C++17 に対する Polyspace サポートには影響しません。
C++2017-P0154R1 ハードウェア干渉サイズ Visual Studio コンパイラでサポート
C++2017-P0170R1 constexpr ラムダ式 部分的にサポート
C++2017-P018R0範囲ベース for ループでの begin と end の型の不一致はい
C++2017-P0188R1[[fallthrough]] 属性はい
C++2017-P0189R1 [[nodiscard]] 属性 はい
C++2017-P0195R2 using 宣言でのパック展開 はい
C++2017-P0212R1 [[maybe_unused]] 属性 はい
C++2017-P0217R3 構造化バインディング Polyspace では、rvalue を使用することによるバインディングをサポートしません。
C++2017-P0218R1 std::filesystem いいえ
C++2017-P0220R1std::anyはい
C++2017-P0220R1std::optionalBug Finder では構文をサポートします。セマンティクスは部分的にサポートされます。Code Prover ではこの機能はサポートされていません。
C++2017-P0226R1数学の特殊関数いいえ
C++2017-P0245R1 16 進浮動小数点リテラル はい
C++2017-P0283R2 不明な属性の無視 はい
C++2017-P0292R2 constexpr if ステートメント はい
C++2017-P0298R3 std::byte はい
C++2017-P0305R1 if と switch の初期化ステートメント はい
C++2017-P0386R2 インライン変数 いいえ
C++2017-P0522R0 テンプレート template-argumenttemplate-parameter に対して有効な一致である場合の呼び出し決定の部分的な順序付け部分的にサポート

参考

トピック