ホームページ  >  記事  >  バックエンド開発  >  C++17の新機能は何ですか

C++17の新機能は何ですか

青灯夜游
青灯夜游オリジナル
2021-01-29 11:57:1512814ブラウズ

c 17 の新機能には次のものが含まれます: 1. 自動式導出のルールの変更; 2. ラムダ式で「*this」をキャプチャできる; 3. ヘッダー ファイルでグローバル変数を直接定義できる新しいインライン変数; 4. 条件式での初期化ステートメントをサポート; 5. 列挙型の直接リスト初期化など。

C++17の新機能は何ですか

このチュートリアルの動作環境: Windows 7 システム、C 17 バージョン、Dell G3 コンピューター。

関連する推奨事項: 「C ビデオ チュートリアル

C 17 の新機能

1. auto キーワード

c 11 以降、auto キーワードは初期化子を通じて変数の型を推測できます。 C 14 では、auto キーワードの機能がさらに改良され、関数の戻り値の型を return ステートメントを通じて推定できるようになりました。 auto キーワードを使用すると、コーディング効率が向上し、再構成プロセスが簡素化されます。ただし、C 11 での自動導出では、予想とは異なる結果が得られることがよくあります。

c 11 で統合初期化をサポートするために、次に示すように、新しい統合初期化構文が導入されました。

// c++11
auto x3{ 1, 2 }; // std::initializer_list<int>
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
auto x5{ 3 };    // std::initializer_list<int>

これら 3 つの方法で初期化された変数の場合、最終的な型導出結果は、私たちが考える int ではなく、std::initializer_list になります。これは、変数 auto を宣言する式を {} で囲んだ場合、推定される型が std::initializer_list となるためです。

C 17 では、auto 式導出のルールが変更されました

// c++17
auto x3{ 1, 2 }; // error: not a single element
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
auto x5{ 3 };    // decltype(x5) is int

比較の結果、auto x5{3} は変数を x5 に直接導出するのに対し、x3{1, 2} は変数を直接導出することがわかりました。このメソッドもコンパイルに失敗します。自動導出のルールがより直感的になりました。

2. ラムダ式

lambda は C 11 でも導入されました。C 11 では、ラムダ式は現在のオブジェクトである this のみをキャプチャできます。唯一の参考。 C 17 では、現在のオブジェクトのコピーである *this をキャプチャできます。現在のオブジェクトのコピーをキャプチャすると、現在のオブジェクトが解放された後、ラムダ式で this 内の変数とメソッドを安全に呼び出すことができます。

3. インライン変数

インライン変数では、変数を複数回定義できます。 C 17 より前では、グローバル変数を定義するときは、常に cpp ファイル内で変数を定義し、その後 extern キーワードを使用して変数が別の場所で定義されていることをコンパイラに伝える必要がありました。インライン変数が表示された後は、再定義エラー メッセージを気にすることなく、ヘッダー ファイル内でグローバル変数を直接定義できます。

4. 条件式で初期化ステートメントがサポートされます

c 17 は、if ステートメントまたは switch ステートメントでの初期化をサポートします。この機能の出現により、コードをより簡潔にすることができます。

// c++17之前
map<int, string> c = {{1,"a"}};
{
    auto res = c.insert(make_pair(2, "b"));
    if(!res.second) {
        cout << "key 1 exist" << endl;
    } else {
        cout << "insert success, value:" << res.first->second << endl;
    }
}

上記のコードでは、res は一時変数であり、後続のコードに影響を与えたくないため、中括弧のペアを使用してスコープを制限しています。ただし、c 17 の構文を使用し、if 条件で res を初期化すると、コードはより簡潔に表示されます。

// c++17
map<int, string> c = {{1,"a"}};
if(auto res = c.insert(make_pair(2, "b")); !res.second ) {
    cout << "key 1 exist" << endl;
} else {
    cout << "insert success, value:" << res.first->second << endl;
}

c 17 の標準ライブラリも拡張され、次のデータ型が追加されました。

1. std::variant

std::variant はタイプセーフな共用体であり、共用体の拡張バージョンです。Variant は、次のようなより複雑なデータ型をサポートします。 map 、 string など

2. std::optional

std::optional は可能な値を表します。関数を通じてオブジェクトを作成する場合、通常は関数を使用してエラー コードを返し、パラメータを通じてオブジェクト自体を返します。

std::optional では、

has_value()   // 检查对象是否有值
value()       // 返回对象的值,值不存在时则抛出 std::bad_optional_access 异常
value_or()    // 值存在时返回值,不存在时返回默认值

3. std::any# で作成したインスタンスを返すと、より直感的になります。

##任意の値を保存できるタイプセーフなコンテナー

4. std::string_view

string_view c17 でブースト バージョンの string_view を初めて使用しました。ブーストと似ています。 string_view は、元の文字列への読み取り専用の参照として理解できます。 string_view 自体は、元の文字列データを保存するための追加メモリを適用せず、元の文字列のアドレスと長さを保存するだけです。多くの場合、文字列は一時的に処理されるだけであり、元の文字列のコピーは必要ありません。 string_view を使用すると、不必要なメモリ コピーが削減され、プログラムのパフォーマンスが向上します。文字列ポインターを使用する場合と比較して、string_view はより適切なカプセル化を提供します。

string_view には元の文字列の所有権がないため、string_view を使用する場合は元の文字列のライフサイクルに注意する必要があることに注意してください。元の文字列が破棄されると、string_view を呼び出すことができなくなります。

その他の機能:

さらに、C 17 ではその他の機能も追加されていますが、この記事では 1 つずつ挙げていません。

  • ブール式は使用できません。これら 2 つの増分 (減少) 演算子は使用されなくなりました

  • #c 17 の例外は、 type システムの一部、

  • 列挙型の直接リスト初期化

  • 構造化バインディング

  • constexpr if 式

  • map はマージと抽出をサポートします

プログラミング関連の知識について詳しくは、プログラミング学習をご覧ください。 !

以上がC++17の新機能は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。