@@ -300,15 +300,15 @@ <h2>この機能が必要になった背景・経緯</h2>
300300</ p >
301301< p > この問題に対して、C++17では (対応が早い処理系はそれ以前から) これらのクラスのコンストラクタが、条件付きで< code > explicit</ code > 定義されるようにした。その実装方法としてはSFINAEによって、< code > explicit</ code > コンストラクタと非< code > explicit</ code > コンストラクタをオーバーロードする方法が使われていた。</ p >
302302< 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 >
304304 < 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 >
305305 < span class ="n "> < a href ="../../reference/type_traits/enable_if.html "> std::enable_if_t</ a > </ span > < span class ="o "> <</ span >
306306 < 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 >
307307 < 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 >
308308 < 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 >
309309 < 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 >
310310 < 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 >
312312
313313 < 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 >
314314 < 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>
317317 < 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 >
318318 < 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 >
319319 < 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 >
321321< span class ="p "> };</ span >
322322</ code > </ pre > </ div >
323323</ p >
324324< p > SFINAEによるオーバーロードはパラメータ型を制約するために依然として必要だが、関数ボディの実装が共通である< code > explicit</ code > コンストラクタと非< code > explicit</ code > コンストラクタは、オーバーロードではなく条件による切り替えをしたかったため、条件付きで関数を< code > explicit</ code > にする構文が追加されることとなった。これを使用した場合、前述した< code > < a href ="../../reference/utility/pair.html "> std::pair</ a > </ code > のコンストラクタは、以下のように宣言できる:</ p >
325325< 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 >
327327 < 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 >
328328 < span class ="n "> < a href ="../../reference/type_traits/enable_if.html "> std::enable_if_t</ a > </ span > < span class ="o "> <</ span >
329329 < 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 >
330330 < 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 >
331331 < 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 >
332332 < 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 >
334334< span class ="p "> };</ span >
335335</ code > </ pre > </ div >
336336</ p >
337337< p > コンセプトを使用した場合は、以下のようになる:</ p >
338338< 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 >
340340 < 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 >
341341 < 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 >
342342 < 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 >
343343 < 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 >
345345< span class ="p "> };</ span >
346346</ code > </ pre > </ div >
347347</ p >
0 commit comments