From bbf0c78e4950b3cec5fba5986840fcd0064a38da Mon Sep 17 00:00:00 2001 From: onihusube <44743040+onihusube@users.noreply.github.com> Date: Tue, 11 Apr 2023 10:24:47 +0900 Subject: [PATCH] =?UTF-8?q?pair=E3=82=B3=E3=83=B3=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=83=A9=E3=82=AF=E3=82=BF=20:=20explicit/delete=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E3=81=AE=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/utility/pair/op_constructor.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/reference/utility/pair/op_constructor.md b/reference/utility/pair/op_constructor.md index 2556f04c2..f4a009000 100644 --- a/reference/utility/pair/op_constructor.md +++ b/reference/utility/pair/op_constructor.md @@ -109,26 +109,34 @@ constexpr pair(piecewise_construct_t, - (11) : - [`is_constructible`](/reference/type_traits/is_constructible.md)`::value &&` [`is_constructible`](/reference/type_traits/is_constructible.md)`::value`であること +## delete定義される条件(C++23) + +- (5) : [`reference_constructs_from_temporary_v`](/reference/type_traits/reference_constructs_from_temporary.md)` ||` [`reference_constructs_from_temporary_v`](/reference/type_traits/reference_constructs_from_temporary.md)``である場合、このコンストラクタは削除定義される +- (6)-(10) : + - `FWD(u)`を`static_cast(u)`と定義して + - [`reference_constructs_from_temporary_v`](/reference/type_traits/reference_constructs_from_temporary.md)`(FWD(p)))> ||` [`reference_constructs_from_temporary_v`](/reference/type_traits/reference_constructs_from_temporary.md)`(FWD(p)))>`である場合、このコンストラクタは削除定義される +- (11) : 要素型(`T1, T2`のどちらかもしくは両方)が参照型であり、初期化によって一時オブジェクトを束縛することになる場合、このコンストラクタは削除定義される + - 上記のコンストラクタと同様に、[`reference_constructs_from_temporary`](/reference/type_traits/reference_constructs_from_temporary.md)を使用して判定される + +## explicitになる条件 -## 備考 - (1) : - C++17 : `first_type`と`second_type`のどちらかが非暗黙にデフォルト構築できない場合、`explicit`指定される - (4) : - C++17 : `!`[`is_convertible_v`](/reference/type_traits/is_convertible.md)` || !`[`is_convertible_v`](/reference/type_traits/is_convertible.md)``である場合、`explicit`指定される - (5) : - C++17 : `!`[`is_convertible_v`](/reference/type_traits/is_convertible.md)` || !`[`is_convertible_v`](/reference/type_traits/is_convertible.md)``である場合、`explicit`指定される - - C++23 : [`reference_constructs_from_temporary_v`](/reference/type_traits/reference_constructs_from_temporary.md)` ||` [`reference_constructs_from_temporary_v`](/reference/type_traits/reference_constructs_from_temporary.md)``である場合、このコンストラクタは削除定義される - (6)-(10) : - `FWD(u)`を`static_cast(u)`と定義して - C++23 : `!`[`is_convertible_v`](/reference/type_traits/is_convertible.md)`(FWD(p))), T1> || !`[`is_convertible_v`](/reference/type_traits/is_convertible.md)`(FWD(p))), T2>`である場合、`explicit`指定される - - C++23 : [`reference_constructs_from_temporary_v`](/reference/type_traits/reference_constructs_from_temporary.md)`(FWD(p)))> ||` [`reference_constructs_from_temporary_v`](/reference/type_traits/reference_constructs_from_temporary.md)`(FWD(p)))>`である場合、このコンストラクタは削除定義される - (7) : - C++17 : `!`[`is_convertible_v`](/reference/type_traits/is_convertible.md)` || !`[`is_convertible_v`](/reference/type_traits/is_convertible.md)``である場合、`explicit`指定される - - C++23 : (6)-(10) での定義参照 - (8) : - C++17 : `!`[`is_convertible_v`](/reference/type_traits/is_convertible.md)` || !`[`is_convertible_v`](/reference/type_traits/is_convertible.md)``である場合、`explicit`指定される - - C++23 : (6)-(10) での定義参照 -- (11) : このコンストラクタでは`first`/`second`をそのコンストラクタ引数から直接構築するため、ムーブもコピーもできないような型でも初期化することができる + +## 備考 + +- (11)のコンストラクタでは`first`/`second`をそのコンストラクタ引数から直接構築するため、コピーもムーブもできないような型でも初期化することができる - C++17では、コンストラクタの各オーバーロードが条件付きで`explicit`となるよう規定された。これは、以下のような初期化子リストを使用したC++17での初期化が不適格になっていたため、適格になるようにするための変更である: ```cpp @@ -143,7 +151,7 @@ constexpr pair(piecewise_construct_t, - この変更はC++17に対するものであるが、コンパイラが早期に対応していたため、一部処理系ではC++14の段階から適格となっていた -- C++23 では、ダングリング参照の作成が簡単にできていた状態を改善するべく、[`reference_constructs_from_temporary`](/reference/type_traits/reference_constructs_from_temporary.md)が追加され、ダングリング参照が作成される場合には不適格とするようになった : +- C++23 では、ダングリング参照の作成が簡単にできていた状態を改善するべく、[`reference_constructs_from_temporary`](/reference/type_traits/reference_constructs_from_temporary.md)が追加され、一部のコンストラクタにおいてダングリング参照が作成される場合には不適格とするようになった : ```cpp // コンストラクタ引数で std::string が構築され // その一時オブジェクトが束縛されるため、ダングリング参照となっていた