@@ -300,15 +300,15 @@ <h2>この機能が必要になった背景・経緯</h2>
300
300
</ p >
301
301
< p > この問題に対して、C++17では (対応が早い処理系はそれ以前から) これらのクラスのコンストラクタが、条件付きで< code > explicit</ code > 定義されるようにした。その実装方法としてはSFINAEによって、< code > explicit</ code > コンストラクタと非< code > explicit</ code > コンストラクタをオーバーロードする方法が使われていた。</ p >
302
302
< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> typename</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="k "> typename</ span > < span class ="n "> T2</ span > < span class ="o "> ></ span >
303
- < span class ="k "> struct</ span > < span class ="n "> pair</ span > < span class ="p "> {</ span >
303
+ < span class ="k "> struct</ span > < span class ="n "> < a href =" ../../reference/utility/ pair.html " > pair </ a > </ span > < span class ="p "> {</ span >
304
304
< span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> typename</ span > < span class ="n "> U1</ span > < span class ="o "> =</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="k "> typename</ span > < span class ="n "> U2</ span > < span class ="o "> =</ span > < span class ="n "> T2</ span > < span class ="p "> ,</ span >
305
305
< span class ="n "> < a href ="../../reference/type_traits/enable_if.html "> std::enable_if_t</ a > </ span > < span class ="o "> <</ span >
306
306
< span class ="n "> < a href ="../../reference/type_traits/is_constructible.html "> std::is_constructible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="n "> U1</ span > < span class ="o "> ></ span > < span class ="o "> &&</ span >
307
307
< span class ="n "> < a href ="../../reference/type_traits/is_constructible.html "> std::is_constructible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> T2</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> ></ span > < span class ="o "> &&</ span >
308
308
< span class ="n "> < a href ="../../reference/type_traits/is_convertible.html "> std::is_convertible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> U1</ span > < span class ="p "> ,</ span > < span class ="n "> T1</ span > < span class ="o "> ></ span > < span class ="o "> &&</ span >
309
309
< span class ="n "> < a href ="../../reference/type_traits/is_convertible.html "> std::is_convertible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> U2</ span > < span class ="p "> ,</ span > < span class ="n "> T2</ span > < span class ="o "> ></ span >
310
310
< span class ="p "> ,</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="o "> =</ span > < span class ="mi "> 0</ span > < span class ="o "> ></ span >
311
- < span class ="k "> constexpr</ span > < span class ="n "> pair</ span > < span class ="p "> (</ span > < span class ="n "> U1</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> &&</ span > < span class ="p "> );</ span >
311
+ < span class ="k "> constexpr</ span > < span class ="n "> < a href =" ../../reference/utility/ pair.html " > pair </ a > </ span > < span class ="p "> (</ span > < span class ="n "> U1</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> &&</ span > < span class ="p "> );</ span >
312
312
313
313
< span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> typename</ span > < span class ="n "> U1</ span > < span class ="o "> =</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="k "> typename</ span > < span class ="n "> U2</ span > < span class ="o "> =</ span > < span class ="n "> T2</ span > < span class ="p "> ,</ span >
314
314
< span class ="n "> < a href ="../../reference/type_traits/enable_if.html "> std::enable_if_t</ a > </ span > < span class ="o "> <</ span >
@@ -317,31 +317,31 @@ <h2>この機能が必要になった背景・経緯</h2>
317
317
< span class ="o "> !</ span > < span class ="p "> (</ span > < span class ="n "> < a href ="../../reference/type_traits/is_convertible.html "> std::is_convertible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> U1</ span > < span class ="p "> ,</ span > < span class ="n "> T1</ span > < span class ="o "> ></ span > < span class ="o "> &&</ span >
318
318
< span class ="n "> < a href ="../../reference/type_traits/is_convertible.html "> std::is_convertible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> U2</ span > < span class ="p "> ,</ span > < span class ="n "> T2</ span > < span class ="o "> ></ span > < span class ="p "> )</ span >
319
319
< span class ="p "> ,</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="o "> =</ span > < span class ="mi "> 0</ span > < span class ="o "> ></ span >
320
- < span class ="k "> explicit</ span > < span class ="k "> constexpr</ span > < span class ="n "> pair</ span > < span class ="p "> (</ span > < span class ="n "> U1</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> &&</ span > < span class ="p "> );</ span >
320
+ < span class ="k "> explicit</ span > < span class ="k "> constexpr</ span > < span class ="n "> < a href =" ../../reference/utility/ pair.html " > pair </ a > </ span > < span class ="p "> (</ span > < span class ="n "> U1</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> &&</ span > < span class ="p "> );</ span >
321
321
< span class ="p "> };</ span >
322
322
</ code > </ pre > </ div >
323
323
</ p >
324
324
< p > SFINAEによるオーバーロードはパラメータ型を制約するために依然として必要だが、関数ボディの実装が共通である< code > explicit</ code > コンストラクタと非< code > explicit</ code > コンストラクタは、オーバーロードではなく条件による切り替えをしたかったため、条件付きで関数を< code > explicit</ code > にする構文が追加されることとなった。これを使用した場合、前述した< code > < a href ="../../reference/utility/pair.html "> std::pair</ a > </ code > のコンストラクタは、以下のように宣言できる:</ p >
325
325
< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> typename</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="k "> typename</ span > < span class ="n "> T2</ span > < span class ="o "> ></ span >
326
- < span class ="k "> struct</ span > < span class ="n "> pair</ span > < span class ="p "> {</ span >
326
+ < span class ="k "> struct</ span > < span class ="n "> < a href =" ../../reference/utility/ pair.html " > pair </ a > </ span > < span class ="p "> {</ span >
327
327
< span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> typename</ span > < span class ="n "> U1</ span > < span class ="o "> =</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="k "> typename</ span > < span class ="n "> U2</ span > < span class ="o "> =</ span > < span class ="n "> T2</ span > < span class ="p "> ,</ span >
328
328
< span class ="n "> < a href ="../../reference/type_traits/enable_if.html "> std::enable_if_t</ a > </ span > < span class ="o "> <</ span >
329
329
< span class ="n "> < a href ="../../reference/type_traits/is_constructible.html "> std::is_constructible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="n "> U1</ span > < span class ="o "> ></ span > < span class ="o "> &&</ span >
330
330
< span class ="n "> < a href ="../../reference/type_traits/is_constructible.html "> std::is_constructible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> T2</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> ></ span >
331
331
< span class ="p "> ,</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="o "> =</ span > < span class ="mi "> 0</ span > < span class ="o "> ></ span >
332
332
< span class ="k "> explicit</ span > < span class ="p "> (</ span > < span class ="o "> !</ span > < span class ="n "> < a href ="../../reference/type_traits/is_convertible.html "> std::is_convertible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> U1</ span > < span class ="p "> ,</ span > < span class ="n "> T1</ span > < span class ="o "> ></ span > < span class ="o "> ||</ span > < span class ="o "> !</ span > < span class ="n "> < a href ="../../reference/type_traits/is_convertible.html "> std::is_convertible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> U2</ span > < span class ="p "> ,</ span > < span class ="n "> T2</ span > < span class ="o "> ></ span > < span class ="p "> )</ span >
333
- < span class ="k "> constexpr</ span > < span class ="n "> pair</ span > < span class ="p "> (</ span > < span class ="n "> U1</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> &&</ span > < span class ="p "> );</ span >
333
+ < span class ="k "> constexpr</ span > < span class ="n "> < a href =" ../../reference/utility/ pair.html " > pair </ a > </ span > < span class ="p "> (</ span > < span class ="n "> U1</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> &&</ span > < span class ="p "> );</ span >
334
334
< span class ="p "> };</ span >
335
335
</ code > </ pre > </ div >
336
336
</ p >
337
337
< p > コンセプトを使用した場合は、以下のようになる:</ p >
338
338
< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> typename</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="k "> typename</ span > < span class ="n "> T2</ span > < span class ="o "> ></ span >
339
- < span class ="k "> struct</ span > < span class ="n "> pair</ span > < span class ="p "> {</ span >
339
+ < span class ="k "> struct</ span > < span class ="n "> < a href =" ../../reference/utility/ pair.html " > pair </ a > </ span > < span class ="p "> {</ span >
340
340
< span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> typename</ span > < span class ="n "> U1</ span > < span class ="o "> =</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="k "> typename</ span > < span class ="n "> U2</ span > < span class ="o "> =</ span > < span class ="n "> T2</ span > < span class ="o "> ></ span >
341
341
< span class ="n "> requires</ span > < span class ="n "> < a href ="../../reference/type_traits/is_constructible.html "> std::is_constructible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> T1</ span > < span class ="p "> ,</ span > < span class ="n "> U1</ span > < span class ="o "> ></ span > < span class ="o "> &&</ span >
342
342
< span class ="n "> < a href ="../../reference/type_traits/is_constructible.html "> std::is_constructible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> T2</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> ></ span >
343
343
< span class ="k "> explicit</ span > < span class ="p "> (</ span > < span class ="o "> !</ span > < span class ="n "> < a href ="../../reference/type_traits/is_convertible.html "> std::is_convertible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> U1</ span > < span class ="p "> ,</ span > < span class ="n "> T1</ span > < span class ="o "> ></ span > < span class ="o "> ||</ span > < span class ="o "> !</ span > < span class ="n "> < a href ="../../reference/type_traits/is_convertible.html "> std::is_convertible_v</ a > </ span > < span class ="o "> <</ span > < span class ="n "> U2</ span > < span class ="p "> ,</ span > < span class ="n "> T2</ span > < span class ="o "> ></ span > < span class ="p "> )</ span >
344
- < span class ="k "> constexpr</ span > < span class ="n "> pair</ span > < span class ="p "> (</ span > < span class ="n "> U1</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> &&</ span > < span class ="p "> );</ span >
344
+ < span class ="k "> constexpr</ span > < span class ="n "> < a href =" ../../reference/utility/ pair.html " > pair </ a > </ span > < span class ="p "> (</ span > < span class ="n "> U1</ span > < span class ="o "> &&</ span > < span class ="p "> ,</ span > < span class ="n "> U2</ span > < span class ="o "> &&</ span > < span class ="p "> );</ span >
345
345
< span class ="p "> };</ span >
346
346
</ code > </ pre > </ div >
347
347
</ p >
0 commit comments