cpprefjp で機能を斜め読みしたときのメモ

## C++11

https://cpprefjp.github.io/lang/cpp11/utf8_string_literals.html

`C++20` で UTF-8文字列リテラルが型が追加される。
文字リテラルについては `C++17` から。


https://cpprefjp.github.io/lang/cpp11/extend_friend_targets.html

もしかすると、特殊なアクセスクラスを定義できるかも。


https://cpprefjp.github.io/lang/cpp11/noexcept.html

パフォーマンス向上という側面があるのか。
あと、昔から見かける `throw` キーワードは `C++11`で非推奨、　`C++17` で削除（コンパイルエラー）。


https://cpprefjp.github.io/lang/cpp11/override_final.html

知ってたけど使ってなかった。


https://cpprefjp.github.io/lang/cpp11/inline_namespaces.html

知らんかった。


https://cpprefjp.github.io/lang/cpp11/thread_local_storage.html

あまり使うことは無いと思うけど。



https://cpprefjp.github.io/lang/cpp11/static_initialization_thread_safely.html

以前の記事でコメントいただいたもの。 `Singleton` で使える。


https://cpprefjp.github.io/lang/cpp11/ref_qualifier_for_this.html

まだ自分の実装で使う機会に遭遇していない。


https://cpprefjp.github.io/lang/cpp11/user_defined_literals.html

目玉飛び出た。


https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html

いい加減、癖つけるべきかな。


https://cpprefjp.github.io/lang/cpp11/global_scope_syntax_in_nested_name_specifier.html

あれ？　`::` 居るんだっけ？　許可されただけの話？


https://cpprefjp.github.io/lang/cpp11/trailing_comma_following_enumerator_list.html

個人的には嫌だけど仕様としては明確に許可されている。


https://cpprefjp.github.io/lang/cpp11/variadic_templates.html

パラメータパックの拡張はたまに忘れる。


https://cpprefjp.github.io/lang/cpp11/attributes.html

`[[noreturn]]` は知っていたが `[[carries_dependency]]` は知らんかった。


https://cpprefjp.github.io/lang/cpp11/explicit_conversion_operator.html

`explicit` ってコンストラクタ以外でもあるのね。


https://cpprefjp.github.io/lang/cpp11/range_based_for.html

進化中。`C++17` で更にバージョンアップ。（beginとendの型が異なってもOKになる）


https://cpprefjp.github.io/lang/cpp11/inheriting_constructors.html

まじ？


https://cpprefjp.github.io/lang/cpp11/non_static_data_member_initializers.html

デフォルトコンストラクタで初期化子を並べるより初期化ミスが減る気がする。

## C++14

https://cpprefjp.github.io/lang/cpp14/relaxing_constraints_on_constexpr.html

`constexpr` 関数内で変数の書き換え許可ができるらしい。関数自体はコンパイル時定数だけど、副作用作れるのね。


https://cpprefjp.github.io/lang/cpp14/generic_lambdas.html

ラムダ式で template 使える。
当たり前だが、具体化しないと `std::function` には詰め込めない。


https://cpprefjp.github.io/lang/cpp14/initialize_capture.html

ラムダ式のキャプチャ指定子で `std::move` が使えるのはこの子のお陰なので `C++14` 以降となる。

https://cpprefjp.github.io/lang/cpp14/clarifying_memory_allocation.html

生ポインタ使う機会が少ないから微妙だけど、こんな事ができるのね。

https://cpprefjp.github.io/lang/cpp14/variable_templates.html

おっ！と思ったが、科学技術計算系じゃないと縁が無いかも。
ちなみに、この件のデフォルトテンプレート引数のサポートは `C++17` から。

https://cpprefjp.github.io/lang/cpp14/brace_elision_in_array_temporary_initialization.html

気をつけないと、`C++11`でエラーが多発するかも。

https://cpprefjp.github.io/lang/cpp14/placeholder_type_in_trailing_return_type.html

auto がいっぱい。何となく今後のバージョンで後置式のルールが変わりそうな予感。

https://cpprefjp.github.io/lang/cpp14/digit_separators.html

地味に便利。何桁毎に区切るかは任意。


## C++17

https://cpprefjp.github.io/lang/cpp17/if_constexpr.html

`#if defined` を拡張した感じだが、 `template` で特定の型だとエラーが発生するため制御を分けたい場合なんかに重宝しそう。


https://cpprefjp.github.io/lang/cpp17/constexpr_lambda.html

いつか使うかも。

https://cpprefjp.github.io/lang/cpp17/construction_enum_class_values.html

`POD` 系のデータ変換とかで無理やりが無くなるかも。

https://cpprefjp.github.io/lang/cpp17/selection_statements_with_initializer.html

変数定義がスコープに収まって便利かも。慣れが必要だな。

https://cpprefjp.github.io/lang/cpp17/pack_expansions_in_using.html

これは捗る。

https://cpprefjp.github.io/lang/cpp17/inline_variables.html

ようやく出たか。
あと、 `inline` の定義って、関数が（積極的に）展開されるって意味だけじゃなく、同一アドレスに配置されるという意味があるのを再確認。

https://cpprefjp.github.io/lang/cpp17/type_deduction_for_class_templates.html

これで、生成ヘルパー関数が不要になりそう。

https://cpprefjp.github.io/lang/cpp17/allow_typename_in_a_template_template_parameter.html

そんな制約あったのね。 `C++17` で制約撤廃。

https://cpprefjp.github.io/lang/cpp17/exception_spec_be_part_of_the_type_system.html

`const` 的な感じ。

https://cpprefjp.github.io/lang/cpp17/guaranteed_copy_elision.html

ここで言う「コピー省略」とはコピーコンストラクタを起動させないという意味。
`clang` で `NRVO` (Named Return Value Optimization)を `std::move` で返却すると「やる必要無いよ」的な警告出たような。要確認。

https://cpprefjp.github.io/lang/cpp17/nested_namespace.html

ライブラリとか作るときに便利。

https://cpprefjp.github.io/lang/cpp17/allow_constant_evaluation_for_all_non-type_template_arguments.html

これは偉大。 `TypeScript` の文字列リテラル型みたいの作れるかも？

https://cpprefjp.github.io/lang/cpp17/expression_evaluation_order.html

`auto a += ++b;` 問題がこれにて終結。（`++b` が先に評価される）
基本的に代入式以外は左が先に評価される。

https://cpprefjp.github.io/lang/cpp17/replacement_of_class_objects_containing_reference_members.html

`std::launder` って何者だ？

https://cpprefjp.github.io/lang/cpp17/using_attribute_namespaces.html

へぇ〜（小並感）

https://cpprefjp.github.io/lang/cpp17/structured_bindings.html

ここでようやくか。。。ちなみに型はどうなるんだ？？参照はできるんか？？

https://cpprefjp.github.io/lang/cpp17/new_rules_for_auto_deduction_from_braced-init-list.html

やりたければ、可変引数テンプレートにしろってやつね。

https://cpprefjp.github.io/lang/cpp17/folding_expressions.html

ん？　あ！　なるへそ！！

https://cpprefjp.github.io/lang/cpp17/extension_to_aggregate_initialization.html

確かに今まで面倒だったけど、実際、あまり使うケース無いかな。

https://cpprefjp.github.io/lang/cpp17/declaring_non-type_template_arguments_with_auto.html

そのうち使うかもだけど `C++14` を考えると、今のところ取り立てて必要なものでもないかな。

https://cpprefjp.github.io/lang/cpp17/remove_deprecated_increment_of_bool.html

これやってたらゲンコツものでしょ。
ちゅうか、この記事で `std::exchage` を知ったわ。

https://cpprefjp.github.io/lang/cpp17/remove_deprecated_use_of_the_register_keyword.html

さよなら。　でも、別な機能で復活するかもね。


## C++20

https://cpprefjp.github.io/lang/cpp20/consistent_comparison.html

`<=>` 宇宙船演算子。 これで得られる値はboolではなく　`比較カテゴリ型`　という特殊な型になる。数値比較が困難なものに対する順位付けを一般化した感じ。コンパイラで演算子を許容して、ライブラリで実装するという珍しいパターン。

https://cpprefjp.github.io/lang/cpp20/default_member_initializers_for_bit_fields.html

最近はぬるま湯な環境をターゲットにして開発してるから、ビットフィールドを使う場面が減ったなぁ。。。

https://cpprefjp.github.io/lang/cpp20/explicit_bool.html

`SFINAE`を利用した実装パターンを整理しているんだろうな。`SFINAE`による恩恵は大きいものの、可読性の低さや、エラーが難解というデメリットを排除する活動の一貫だと思う。

https://cpprefjp.github.io/lang/cpp20/fixing_const_qualified_pointers_to_members.html

そもそも `.*` なんて使ったことなかったので利用用途不明。ディスパッチテーブルとかで使うのかな？

https://cpprefjp.github.io/lang/cpp20/resolving_const_mismatch_with_defaulted_copy_constructor.html

意図して、`自身の非const参照を受けるコンストラクタ`なんて書かないけど、`template`では問題となるな。

https://cpprefjp.github.io/lang/cpp20/access_checking_on_specializations.html

クラス内クラスが`非public`で定義されていた場合、その子クラスは親クラス内だとしても`非public`はアクセスは禁止だったのに、実際はアクセスできるコンパイラーが続出して、そのままグレーな状態で取り扱われていたらしい。`Java`って、こんな感じだったような。でも、`template`では厳格に規制されていたので、一緒にグレーにするという話。`friend`って使えたような気もするが、気のせいだったかな？

https://cpprefjp.github.io/lang/cpp20/language_support_for_empty_objects.html

お〜、これで`unit`型が効率よく作れますな。それはそうと、この説明内で`空の型であっても、ユニークなアドレスを割り当てるために大きさが0にはならない。`ということにガクブル。

https://cpprefjp.github.io/lang/cpp20/allow_structured_bindings_to_accessible_members.html

そもそも、`構造化束縛`ってプリミティブ型だらけだとバグの温床になりそう（例えば座標のx,yをy,xで受けたりとか）だから、`tuple`の展開では使うかもだけど、サンプルのような使い方ってするかなぁ？

https://cpprefjp.github.io/lang/cpp20/relaxing_the_structured_bindings_customization_point_finding_rules.html

理由は分かるが、罠にならないか心配。

https://cpprefjp.github.io/lang/cpp20/checking_for_abstract_class_types.html

地味に助かる。

https://cpprefjp.github.io/lang/cpp20/efficient_sized_delete_for_variable_sized_classes.html

あ〜、もっと早くこれがあれば、階層構造を持つオブジェクトのデストラクタでスタックオーバーフローするのを防げたかもだわ。

https://cpprefjp.github.io/lang/cpp20/implicit_creation_of_objects_for_low-level_object_manipulation.html

`C` からの移植を考慮したものらしい。また、他にもこれにより解決するものがあるみたいだけど、そこまで攻めたコードは書きたくない。

https://cpprefjp.github.io/lang/cpp20/using_enum.html

`switch-case`文で、スコープ指定が長いと、重要な右側が見えなくなるということがなくなるな。

https://cpprefjp.github.io/lang/cpp20/designated_initialization.html

ようやく仕様になった。でも、中途半端だな。せめて順序は自由になってほしい。

https://cpprefjp.github.io/lang/cpp20/extending_structured_bindings_to_be_more_like_variable_declarations.html

構造化束縛で定義した変数をラムダ式へキャプチャできるようになった。

https://cpprefjp.github.io/lang/cpp20/allow_initializing_aggregates_from_a_parenthesized_list_of_values.html

暗黙の型変換が効くのか否かが違うのか。。。これ、どっちかに寄せて欲しい。（できれば暗黙の型変換しない方に）

### 未確認

https://cpprefjp.github.io/lang/cpp20/array_size_deduction_in_new-expressions.html

https://cpprefjp.github.io/lang/cpp20/permit_conversions_to_arrays_of_unknown_bound.html

https://cpprefjp.github.io/lang/cpp20/deprecating_volatile.html

https://cpprefjp.github.io/lang/cpp20/converting_from_pointer_to_bool_should_be_considered_narrowing.html

https://cpprefjp.github.io/lang/cpp20/signed_integers_are_twos_complement.html

https://cpprefjp.github.io/lang/cpp20/char8_t.html

https://cpprefjp.github.io/lang/cpp20/make_char16t_char32t_string_literals_be_utf16_32.html

https://cpprefjp.github.io/lang/cpp20/nodiscard_should_have_a_reason.html

https://cpprefjp.github.io/lang/cpp20/nodiscard_for_constructors.html

https://cpprefjp.github.io/lang/cpp20/range-based_for_statements_with_initializer.html

https://cpprefjp.github.io/lang/cpp20/relaxing_the_range_for_loop_customization_point_finding_rules.html

https://cpprefjp.github.io/lang/cpp20/likely_and_unlikely_attributes.html

https://cpprefjp.github.io/lang/cpp20/concepts.html

https://cpprefjp.github.io/lang/cpp20/function_templates_with_auto_parameters.html

https://cpprefjp.github.io/lang/cpp20/down_with_typename.html

https://cpprefjp.github.io/lang/cpp20/class_types_in_non-type_template_parameters.html

https://cpprefjp.github.io/lang/cpp20/adl_and_function_templates_that_are_not_visible.html

https://cpprefjp.github.io/lang/cpp20/class_template_argument_deduction_for_aggregates.html

https://cpprefjp.github.io/lang/cpp20/class_template_argument_deduction_for_alias_templates.html

https://cpprefjp.github.io/lang/cpp20/less_eager_instantiation_of_constexpr_functions.html

https://cpprefjp.github.io/lang/cpp20/allow_virtual_function_calls_in_constant_expressions.html

https://cpprefjp.github.io/lang/cpp20/allowing_dynamic_cast_polymorphic_typeid_in_constant_expressions.html

https://cpprefjp.github.io/lang/cpp20/try-catch_blocks_in_constexpr_functions.html

https://cpprefjp.github.io/lang/cpp20/immediate_functions.html

https://cpprefjp.github.io/lang/cpp20/changing_the_active_member_of_a_union_inside_constexpr.html

https://cpprefjp.github.io/lang/cpp20/permitting_trivial_default_initialization_in_constexpr_contexts.html

https://cpprefjp.github.io/lang/cpp20/enabling_constexpr_intrinsics_by_permitting_unevaluated_inline-assembly_in_constexpr_functions.html

https://cpprefjp.github.io/lang/cpp20/constinit.html

https://cpprefjp.github.io/lang/cpp20/more_constexpr_containers.html

https://cpprefjp.github.io/lang/cpp20/familiar_template_syntax_for_generic_lambdas.html

https://cpprefjp.github.io/lang/cpp20/allow_lambda_capture_equal_this.html

https://cpprefjp.github.io/lang/cpp20/deprecate_implicit_capture_of_this_via_defcopy.html

https://cpprefjp.github.io/lang/cpp20/simplifying_implicit_lambda_capture.html

https://cpprefjp.github.io/lang/cpp20/default_constructible_and_assignable_stateless_lambdas.html

https://cpprefjp.github.io/lang/cpp20/wording_for_lambdas_in_unevaluated_contexts.html

https://cpprefjp.github.io/lang/cpp20/allow_pack_expansion_in_lambda_init_capture.html

https://cpprefjp.github.io/lang/cpp20/reference_capture_of_structured_bindings.html

https://cpprefjp.github.io/lang/cpp20/nested_inline_mamespaces.html

https://cpprefjp.github.io/lang/cpp20/modules.html

https://cpprefjp.github.io/lang/cpp20/coroutines.html

https://cpprefjp.github.io/lang/cpp20/va_opt.html

https://cpprefjp.github.io/lang/cpp20/deprecate_pod.html

https://cpprefjp.github.io/lang/cpp20/deprecate_implicit_capture_of_this_via_defcopy.html

https://cpprefjp.github.io/lang/cpp20/deprecate_uses_of_the_comma_operator_in_subscripting_expressions.html

https://cpprefjp.github.io/lang/cpp20/remove_deprecated_nothrow_exception_specification.html

https://cpprefjp.github.io/lang/cpp20/prohibit_aggregates_with_user-declared_constructors.html

https://cpprefjp.github.io/lang/cpp20/predefined_macros.html

https://cpprefjp.github.io/lang/cpp20/update_the_reference_to_the_unicode_standard.html

https://cpprefjp.github.io/lang/cpp20/reserving_attribute_namespaces_for_future_use.html