Skip to content

Commit

Permalink
P0848R3: 概要まで
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Jan 23, 2025
1 parent ca2c47c commit 2f8d201
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lang/cpp20.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ C++20とは、2020年中に改訂され、ISO/IEC 14882:2020で標準規格化
| [構造化束縛がカスタマイゼーションポイントを見つけるルールを緩和](cpp20/relaxing_the_structured_bindings_customization_point_finding_rules.md) | 非テンプレートの`get()`メンバ関数が見つかった場合は、非メンバ関数の`get()`を探しにいく |
| [抽象型のチェック](cpp20/checking_for_abstract_class_types.md) | 関数の宣言段階では、パラメータおよび戻り値型が抽象型かどうかをチェックしないようにする |
| [可変長データを扱うクラスの効率的な`delete`](cpp20/efficient_sized_delete_for_variable_sized_classes.md) | クラスの`delete`演算子が呼び出される前にデストラクタが呼ばれないようにするオプションを追加 |
| [条件付きで特殊メンバ関数をトリビアルに定義するように](cpp20/conditionally_trivial_special_member_functions.md.nolink) | 制約によってトリビアルな特殊メンバ関数と非トリビアルな特殊メンバ関数をオーバーロードできるようにする |
| [条件付きで特殊メンバ関数をトリビアルに定義するように](cpp20/conditionally_trivial_special_member_functions.md) | 制約によってトリビアルな特殊メンバ関数と非トリビアルな特殊メンバ関数をオーバーロードできるようにする |
| [未初期化領域への暗黙的なオブジェクト構築](cpp20/implicit_creation_of_objects_for_low-level_object_manipulation.md) | 未初期化領域の利用時に自動的にトリビアルな型のオブジェクトを構築する |


Expand Down
75 changes: 75 additions & 0 deletions lang/cpp20/conditionally_trivial_special_member_functions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# 条件付きで特殊メンバ関数をトリビアルに定義するように
* cpp20[meta cpp]

このページはC++20に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため[関連項目](#relative-page)を参照してください。

## 概要

クラスの特殊メンバ関数(コンストラクタ・代入演算子・デストラクタ)の`default`宣言をコンセプトによって制約することで、テンプレートパラメータの性質に応じて優先的に選択させることができる様になる。

```cpp
template<typename T>
struct wrap {

// 1. 制約されたdefaultなコピーコンストラクタ
wrap(const wrap&) requires std::is_trivially_copy_constructible_v<T> = default;

// 2. ユーザー定義コピーコンストラクタ
wrap(const wrap&) {
...
}
};
```
`T`が`std::is_trivially_copy_constructible`を満たす場合、1の宣言が選択され`wrap<T>`のコピーコンストラクタは`default`実装される(2のコンストラクタが選択されることは無い)。`T`が`std::is_trivially_copy_constructible`を満たさない場合、2の宣言が選択され`wrap<T>`のコピーコンストラクタはユーザー定義される。
特に、`T`がトリビアルコピー可能である場合にこの仕組みによって1のコンストラクタが選択されれば、(他の条件を満たしているものとして)`wrap<T>`もまたトリビアルコピー可能となる。
## 仕様
(執筆中)
## 例
(執筆中)
```cpp example
// (ここには、言語機能の使い方を解説するための、サンプルコードを記述します。)
// (インクルードとmain()関数を含む、実行可能なサンプルコードを記述してください。そのようなコードブロックにはexampleタグを付けます。)
#include <iostream>
int main()
{
int variable = 0;
std::cout << variable << std::endl;
}
```
* variable[color ff0000]

### 出力
```
0
```

## この機能が必要になった背景・経緯

(執筆中)


## 検討されたほかの選択肢

(執筆中)


## ## <a id="relative-page" href="#relative-page">関連項目</a>

- [コンセプト](./concepts.md)

## 参照

- [P0848R0 Conditionally Trivial Special Member Functions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0848r0.html)
- [P0848R3 Conditionally Trivial Special Member Functions](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0848r3.html)

0 comments on commit 2f8d201

Please sign in to comment.