From Jason Turner

[temp.class.order]

Diff to HTML by rtfpessoa

Files changed (1) hide show
  1. tmp/tmpky34y9c1/{from.md → to.md} +0 -63
tmp/tmpky34y9c1/{from.md → to.md} RENAMED
@@ -1,63 +0,0 @@
1
- #### Partial ordering of class template specializations <a id="temp.class.order">[[temp.class.order]]</a>
2
-
3
- For two class template partial specializations, the first is *more
4
- specialized* than the second if, given the following rewrite to two
5
- function templates, the first function template is more specialized than
6
- the second according to the ordering rules for function templates
7
- [[temp.func.order]]:
8
-
9
- - Each of the two function templates has the same template parameters
10
- and associated constraints [[temp.constr.decl]] as the corresponding
11
- partial specialization.
12
- - Each function template has a single function parameter whose type is a
13
- class template specialization where the template arguments are the
14
- corresponding template parameters from the function template for each
15
- template argument in the *template-argument-list* of the
16
- *simple-template-id* of the partial specialization.
17
-
18
- [*Example 1*:
19
-
20
- ``` cpp
21
- template<int I, int J, class T> class X { };
22
- template<int I, int J> class X<I, J, int> { }; // #1
23
- template<int I> class X<I, I, int> { }; // #2
24
-
25
- template<int I0, int J0> void f(X<I0, J0, int>); // A
26
- template<int I0> void f(X<I0, I0, int>); // B
27
-
28
- template <auto v> class Y { };
29
- template <auto* p> class Y<p> { }; // #3
30
- template <auto** pp> class Y<pp> { }; // #4
31
-
32
- template <auto* p0> void g(Y<p0>); // C
33
- template <auto** pp0> void g(Y<pp0>); // D
34
- ```
35
-
36
- According to the ordering rules for function templates, the function
37
- template *B* is more specialized than the function template *A* and the
38
- function template *D* is more specialized than the function template
39
- *C*. Therefore, the partial specialization \#2 is more specialized than
40
- the partial specialization \#1 and the partial specialization \#4 is
41
- more specialized than the partial specialization \#3.
42
-
43
- — *end example*]
44
-
45
- [*Example 2*:
46
-
47
- ``` cpp
48
- template<typename T> concept C = requires (T t) { t.f(); };
49
- template<typename T> concept D = C<T> && requires (T t) { t.f(); };
50
-
51
- template<typename T> class S { };
52
- template<C T> class S<T> { }; // #1
53
- template<D T> class S<T> { }; // #2
54
-
55
- template<C T> void f(S<T>); // A
56
- template<D T> void f(S<T>); // B
57
- ```
58
-
59
- The partial specialization \#2 is more specialized than \#1 because `B`
60
- is more specialized than `A`.
61
-
62
- — *end example*]
63
-