サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
cpprefjp.github.io
このページはC++17に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 外部リンケージを持つ変数に対しインラインinlineを指定することで、複数の翻訳単位で同じ変数を定義できるようになり、変数の実体はただ一つとすることができる。 C++14までは関数のみインライン指定ができたが、C++17では関数、変数ともにインライン指定が可能になった。 これによりヘッダのみで変数の定義を行うことができるようになり、従来のようにヘッダで変数を宣言しソースで変数の実体を定義する必要がなくなった。 // C++17以降 ----- // ヘッダ struct X { // ソースで変数fooを定義する必要がない static inline int foo; }; // C++14以前 ----- // ヘッダ struct X
概要 charの文字列リテラルにu8プレフィックスを付けることで、その文字列リテラルはUCS/Unicode文字コードのUTF-8符号化形式にエンコードされる。 // 変数sには、UTF-8エンコーディングされた「あいうえお」という文字列が代入される char s[] = u8"あいうえお"; // 文字列中にユニバーサルキャラクタ名を直接入力できる。 // \uからはじめて4桁、もしくは\Uからはじめて8桁がユニバーサルキャラクタ名として扱われる。 char t[] = u8"\U00020BB7野家"; // 𠮷野家 u8プレフィックスを指定しない場合は、実装定義のマルチバイト文字コードにエンコードされる。その実装定義の文字コードは、ASCII文字コードと互換があることは保証されない。そのため、UTF-8のASCII互換部分が、実装定義の文字コードと互換があることも、保証されない。
#include <iostream> template<typename> struct ct; template<> struct ct<char> { using type = char; }; int main() { const auto *u8s = u8"text"; // u8sの型はC++17まではconst char *だったが、C++20からはconst char8_t *になる const char *ps = u8s; // C++17までは適格だったがC++20からは不適格 const auto *u8rs = u8R"(text)"; // u8rsの型はC++17まではconst char *だったが、C++20からはconst char8_t *になる const char *prs = u8rs; // C++17までは適格だったがC++20からは不適格
概要 C++20とは、2020年中に改訂され、ISO/IEC 14882:2020で標準規格化されたC++バージョンの通称である。 このバージョンは、策定中はC++2aと呼ばれることがあった。「202a年にリリースされる」という伏せ字として「a」が使われているが、3年周期に次のバージョンが策定されることが決まっているため、伏せ字になっている年数がずれることはない。 言語機能 クラス 言語機能 説明
概要 「構造化束縛 (structured bindings)」は、組やタプル、配列や構造体を分解して各要素を取り出す機能である。 std::pair<int, std::string> f() { return {3, "Hello"}; } // 関数f()の戻り値である整数と文字列の組を分解する。 // pairのfirstをid変数に代入し、secondをmessage変数に代入する。 // id変数の型はfirstの型(int)となり、message変数の型はsecondの型(string)となる。 auto [id, message] = f(); std::cout << id << std::endl; // 「3」が出力される std::cout << message << std::endl; // 「Hello」が出力される この機能は、他の言語では「多重代入 (Mu
標準ヘッダ<condition_variable>で提供される、条件変数(condition variable)の利用方法について説明する。 簡単のため、条件変数condition_variableとロックunique_lock<mutex>の組に対してのみ説明を行う。 condition_variable_anyクラスは、任意のロック型と組み合わせ可能なことを除き、その利用方法はcondition_variableと同じである。 利用の目的 条件変数オブジェクトのみを単体で利用するのではなく、必ずミューテックス(排他制御)オブジェクトと、同ミューテックスで保護されるデータ状態を表す変数群(以下、"ステート"と呼ぶ)という3つの組で利用すること。 条件変数オブジェクトとは、複数スレッドがこの共有"ステート"を更新/参照する場合に、"ステート"の更新を他スレッドに通知/"ステート"が指定条件
概要 C++17とは、2017年12月に改訂され、ISO/IEC 14882:2017で標準規格化されたC++バージョンの通称である。 このバージョンは、策定中はC++1zと呼ばれていた。前バージョンであるC++11が策定中にC++0xと呼ばれ、C++14がC++1yと呼ばれており、「201z年にリリースされる」という年数の伏せ字として「z」が使われていた。 策定体制 C++14の策定開始段階から「Study Group (SG)」と呼ばれる専門家グループが複数作られ、そこで同時並行に新機能の議論、策定が進められていた。C++14ではそれらの機能は導入されなかったが、C++17ではSGで議論された機能のうち、仕様が固まったもののいくつかが導入されることとなった。 各SGで考えられた仕様は「Technical Specification (TS)」という単位で個別に各国の承認をとっている。そ
概要 C++17ではbool型に対する前置および後置のoperator ++を削除する。 bool型に対する前置および後置のoperator ++とはC++98の時点で非推奨になっていた機能である。 具体的にどのような働きをするのかというと、以下のように値をtrueに書き換える機能をもつ。 #include <iostream> int main() { bool b = false; const bool b1 = ++b; std::cout << std::boolalpha << b1 << std::endl; // => true const bool b2 = ++b; std::cout << std::boolalpha << b2 << std::endl; // => true }
概要 従来for文しか使用できなかった初期化をif文とswitch文でも使えるようになった。 for文は下記のように初期化と条件式を同時に書くことができる。 初期化で宣言した変数はfor文のスコープのみで有効でありfor文の外では参照できない特徴がある。 if (status_code c = bar(); c != SUCCESS) { //ステータスコード c が成功ではなかったら、何かして、処理を終了する … return c; } else { //ステータスコード C が成功だったら、何かして、処理を続行する … } //この時点で c は無効 switch (Foo gadget{args}; auto s = gadget.status()) { case OK: //正常 gadget.zip(); break; case Warn: //異常だが、続行 gadget.lo
概要 static_assert宣言は、指定した定数式が真であることを表明するための機能である。 これは、コンパイル時に満たされるべき要件を検証するために使用できる。 template <class T, std::size_t N> struct X { static_assert(N > 0, "number of array elements must greater than 0"); T array[N]; }; 指定した定数式が偽である場合はコンパイルエラーとなり、static_assertの第2引数で指定した文字列リテラルが診断メッセージとして出力される。 仕様 static_assert宣言は、以下の形式を持つ: 定数式は、boolに変換可能な整数定数式であること この宣言は、名前空間スコープ、ブロックスコープ、メンバ宣言といった場所で記述できる 定数式が真であると評価され
概要 従来の関数宣言構文では、戻り値の型は先頭に記述していた。 C++11から、戻り値の型をパラメータリストの後ろに記述する関数宣言構文が追加された。これにより、戻り値の型の文脈で、パラメータの変数を使用できる。 戻り値の型を後置するには、関数宣言の先頭にautoを書き、パラメータリストの後ろに->記号を書き、その後ろに戻り値の型を書く。ここでのautoは、「後ろに書いた戻り値の型を、autoと書いたところに置き換えて使用する」というプレースホルダーを意味する。 // int f() と同じく、戻り値の型としてintを返す関数 auto f() -> int { return 42; } // パラメータの変数aとbを+演算子で足し合わせた結果の型を、 // 関数g()の戻り値型とする auto g(int a, int b) -> decltype(a + b) { return a +
概要 ムーブセマンティクスはコピーコストの削減を主な目的としており、また所有権の移動を実現する。 右辺値参照はムーブ元のオブジェクト(右辺値)を束縛するための言語機能である。 右辺値(Rvalues)と左辺値(Lvalues)について 誤解を恐れずに言えば、右辺値とは名前をもたない一時的なオブジェクトである。 また、左辺値とは明示的に実態のある名前付きオブジェクトである。 struct Foo{} ; int f() { return 0 ; } int main() { int i = 0; i; // 名前付きオブジェクトは左辺値 0; // リテラル値は右辺値 Foo x ; x; // 名前付きオブジェクトは左辺値 Foo(); // コンストラクタの戻り値は右辺値 f(); // 関数の戻り値は右辺値 } 右辺値参照は、右辺値のみを束縛する参照である。 C++11からは、型Tに対
&&に対する別名andのような、各種演算子に対するマクロを定義する。 ただしC++ではこれらの別名はキーワードとして定義されるため、このヘッダでは何も定義されない。
diff --git a/reference/algorithm.md b/reference/algorithm.md index 24441a342..34fe94c3f 100644 --- a/reference/algorithm.md +++ b/reference/algorithm.md @@ -149,6 +149,9 @@ ranges::sort(pv, {}, &Person::name); | [`ranges::find`](algorithm/ranges_find.md) | 指定された値を検索する | C++20 | | [`ranges::find_if`](algorithm/ranges_find_if.md) | 条件を満たす最初の要素を検索する | C++20 | | [`ranges::find_if_not`](algorithm/range
本サイトcpprefjpは、プログラミング言語C++のリファレンスを提供するWebサイトです。 最新C++バージョンのリファレンスを提供していきます。 運営方針 本リファレンスサイトは、C++言語の最新のリファレンスを常に提供し続けることを目標にしています。 各クラス、関数にはそれぞれ1つ以上のサンプルコードを付けていく方針です。 本サイトでは、他サイトおよび規格書の直接的な翻訳ではなく、編集者の調査と考えに基づいた解説を提供していきます。 HTMLデータのダウンロード cpprefjp.github.io-master.zip ローカルで閲覧できるHTMLを用意しています。 スポンサーシップ cpprefjp - Open Collective このプロジェクトは、持続的な活動のため、ユーザーの方々からのご支援をお待ちしております。上記Open Collectiveのプロジェクトでスポン
diff --git a/lang/cpp11/uniform_initialization.md b/lang/cpp11/uniform_initialization.md index b9705fa30..bb0902594 100644 --- a/lang/cpp11/uniform_initialization.md +++ b/lang/cpp11/uniform_initialization.md @@ -5,7 +5,7 @@ このページはC++11に採用された言語機能の変更を解説しています。 -のちのC++規格でさらに変更される場合があるため[関連項目](#relative_page)を参照してください。 +のちのC++規格でさらに変更される場合があるため[関連項目](#relative-page)を参照してください。 <!-- last lang caution --
diff --git a/lang/cpp11/initializer_lists.md b/lang/cpp11/initializer_lists.md index 962448cb4..fd0dffab9 100644 --- a/lang/cpp11/initializer_lists.md +++ b/lang/cpp11/initializer_lists.md @@ -5,7 +5,7 @@ このページはC++11に採用された言語機能の変更を解説しています。 -のちのC++規格でさらに変更される場合があるため[関連項目](#relative_page)を参照してください。 +のちのC++規格でさらに変更される場合があるため[関連項目](#relative-page)を参照してください。 <!-- last lang caution -->
このページはC++11に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 「可変引数テンプレート (variadic templates)」は、任意の型とそのオブジェクトを任意の数だけ受け取る機能である。これによって、「最大でN個のパラメータを受け取る関数テンプレートやクラステンプレート」を実装する際に、N個のオーバーロードをユーザーが用意する必要なく、ひとつの実装だけで済むようになる。 可変引数テンプレートとしてテンプレートパラメータを受け取る場合、テンプレートパラメータを宣言するclassまたはtypenameとテンプレートパラメータの間に、省略記号 ... を入力する: // 0個以上のテンプレートパラメータを受け取る template <class... Args> struct X; // 0個以上の任
diff --git a/lang/cpp14/return_type_deduction_for_normal_functions.md b/lang/cpp14/return_type_deduction_for_normal_functions.md index 05edc55cf..fe8dc74d5 100644 --- a/lang/cpp14/return_type_deduction_for_normal_functions.md +++ b/lang/cpp14/return_type_deduction_for_normal_functions.md @@ -5,7 +5,7 @@ このページはC++14に採用された言語機能の変更を解説しています。 -のちのC++規格でさらに変更される場合があるため[関連項目](#relative_page)を参照してください。 +のち
このページはC++11に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 「SFINAE (Substitution Failure Is Not An Errorの略称、スフィネェと読む)」は、テンプレートの置き換えに失敗した際に、即時にコンパイルエラーとはせず、置き換えに失敗した関数をオーバーロード解決の候補から除外するという言語機能である。 たとえば、関数のシグニチャの一部として「typename T::value_type」が書いてあり、型Tがvalue_typeという型を持っていない場合、その関数がオーバーロード解決から除外される。これによって型が任意の機能を持っているかを、コンパイル時に判定できた。 しかしC++03において、SFINAEによって「型Tに関する任意の式が有効かどうかを判定できるか」は仕
このページはC++11に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 クラスを定義した際、以下のメンバ関数が暗黙的に定義される: デフォルトコンストラクタ コピーコンストラクタ ムーブコンストラクタ コピー代入演算子 ムーブ代入演算子 デストラクタ C++では、暗黙定義される特殊関数を制御するために、= defaultと= deleteという関数定義構文が追加された。 = defaultは、「暗黙定義されるデフォルトの挙動を使用し、inlineやvirtualといった修飾のみを明示的に指定する」という目的に使用する機能である: class X { public: // 暗黙定義される挙動をする、 // 仮想関数のデストラクタを定義する virtual ~X() = default; // 暗黙定義されるデフォ
このページはC++11に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 「委譲コンストラクタ (delegating constructors)」は、コンストラクタから、同じクラスの他のコンストラクタに処理を委譲する機能である。 class X { int i_; public: X(int i) : i_(i) {} // (1) : int型のパラメータを受け取るコンストラクタ X() : X(42) {} // (2) : デフォルトコンストラクタ。 // (1)のコンストラクタに初期値を渡して初期化処理を委譲する }; (2)のコンストラクタでの、X(42)の部分が委譲コンストラクタに当たる。(2)のコンストラクタから(1)のコンストラクタを呼び出し、初期化処理を(1)のコンストラクタに集約している。
このページはC++11に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 ユーザー定義リテラル(User-defined literals)は、123、3.14、"hello"といったリテラルに対して付けられるサフィックスをオーバーロードできるようにすることで、ユーザーがリテラルに意味を持たせられるようにする機能である。 これは、リテラルに対して以下のような情報を持たせるために使用できる: 単位 : メートル、秒、角度として度数法か弧度法、など 型 : "hello"sとすることでstd::string型の文字列リテラル、1.2iとすることでstd::complex<double>型のリテラルとするなど ユーザー定義リテラルは、operator"" サフィックス名の演算子をオーバーロードする。""とサフィックス名
概要 C++14とは、2014年12月に改訂され、ISO/IEC 14882:2014で標準規格化されたC++バージョンの通称である。 前バージョンであるC++11からマイナーバージョンアップされ、小さな機能拡張が行われた。 このバージョンは、策定中はC++1yと呼ばれていた。前バージョンであるC++11が策定中、C++0xと呼ばれていたことから、「xの次」という意味で「y」が使われていた。 言語機能 言語機能 説明
概要 C++11とは、2011年8月に改訂され、ISO/IEC 14882:2011で標準規格化されたC++バージョンの通称である。 前バージョンであるC++03からメジャーバージョンアップされ、多くの有用な機能が追加された。 このバージョンは、策定中はC++0xと呼ばれていた。これは、2009年中までに策定を完了させることを目指して、下一桁を伏せ字にしたものである。 言語機能 一般的な機能 言語機能 説明
このページはC++11に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 「ラムダ式(lambda expressions)」は、簡易的な関数オブジェクトをその場で定義するための機能である。 この機能によって、「高階関数(関数を引数もしくは戻り値とする関数)」をより使いやすくできる。 auto plus = [](int a, int b) { return a + b; }; int result = plus(2, 3); // result == 5 ここでは、[](int a, int b) { return a + b; }というコードがラムダ式に当たる。このラムダ式は、「int型のパラメータを2つとり、それらを足し合わせたint型オブジェクトを返す関数オブジェクト」を定義している。ここでは戻り値の型を
このページはC++11に採用された言語機能の変更を解説しています。 のちのC++規格でさらに変更される場合があるため関連項目を参照してください。 概要 constexprは、汎用的に定数式を表現するための機能である。 constexprは、「constant expression (定数式)」の略語である。 この機能を使用することで、コンパイル時に値が決定する定数、コンパイル時に実行される関数、コンパイル時にリテラルとして振る舞うクラスを定義できる。 定数式の例として、パラメータの値を2乗して返す関数square()は、以下のように記述する: #include <cassert> constexpr int square(int x) { return x * x; } int main() { constexpr int compile_time_result = square(3);
ここでは、C++の言語機能の解説を記載する。 C++11 C++14 C++17 C++20 C++23 C++26 C++ (将来) C++ (廃案) 言語拡張 運営方針 コンパイラの実装状況ページに沿って、言語のバージョンアップによって追加・更新された言語機能を解説する。 C++全体の言語機能を解説することは、当面の間、目指さない。 バージョン更新に追従するのが大変であること、量が途方もなくなる、という理由から、できるところからやる。 C++全体の言語解説を追加する場合には、このページの下にgeneral階層を作って、そこで作業する。
Clang GNU Compiler Collection Intel C++ Compiler Microsoft Visual C++ 本サイトにおける処理系バージョンに記載 本サイトのリファレンスページでは、「処理系」の項目にバージョン番号を記載している。これは、処理系がその機能をサポート開始した厳密なバージョンではなく、リファレンス執筆者が動作確認できたバージョンである。 古くからサポートされている機能だが、古い処理系を入手することが難しい場合などがあるため、本サイトではこのようなルールになっている。 Clang このサイトでは Clang と呼ぶ。「クラン(グ)」と読む。 "clang" C Language Family Frontend for LLVM 別名 clang clang++ Apple LLVMコンパイラ C++11の機能を有効にする -std=c++11オプシ
次のページ
このページを最初にブックマークしてみませんか?
『cpprefjp - C++日本語リファレンス』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く