hokein wrote:

Thanks for implementing it! 

I haven't looked into the implementation details yet.
Before doing so, I want to ensure I understand the standard correctly (the 
standard's wording is a bit hard to follow).

Per C++ 
[over.match.class.deduct#1.10](https://eel.is/c++draft/over.match.class.deduct#1.10):

> In addition, if C is defined and inherits constructors 
> ([[namespace.udecl]](https://eel.is/c++draft/namespace.udecl)) from a direct 
> base class denoted in the 
> [base-specifier-list](https://eel.is/c++draft/class.derived.general#nt:base-specifier-list)
>  by a 
> [class-or-decltype](https://eel.is/c++draft/class.derived.general#nt:class-or-decltype)
>  B, let A be an alias template whose template parameter list is that of C and 
> whose 
> [defining-type-id](https://eel.is/c++draft/dcl.name#nt:defining-type-id) is 
> B[.](https://eel.is/c++draft/over.match.class.deduct#1.sentence-7) If A is a 
> deducible template 
> ([[dcl.type.simple]](https://eel.is/c++draft/dcl.type.simple)), the set 
> contains the guides of A with the return type R of each guide replaced with 
> typename CC<R>​::​type given a class template
template <typename> class CC;
whose primary template is not defined and with a single partial specialization 
whose template parameter list is that of A and whose template argument list is 
a specialization of A with the template argument list of A 
([[temp.dep.type]](https://eel.is/c++draft/temp.dep.type)) having a member 
typedef type designating a template specialization with the template argument 
list of A but with C as the 
template[.](https://eel.is/c++draft/over.match.class.deduct#1.sentence-8)

Let's use the following example to illustrate:

```cpp
template <typename T1> struct B {
  B(T1);
};
template <typename T2> struct C : public B<T2> {
  using B<T2>::B;
};
```

Here, `C` is the struct `C`, and `B` is `B<T2>`.


### Steps:

1. **Find the inherited constructor for class `C`:** `B(T1)`.

2. **Synthesize an alias template `A`:** `template<typename T2> using A = 
B<T2>;`

3. **Check if `A` is a deducible template per 
https://eel.is/c++draft/dcl.type.simple#3:** here A is deducible

4. **Synthesize the deduction guide for `A`:** the one we have interests is 
`auto (T2) -> B(T2)`

5.  **Replace the return type with `CC<B<T2>>::type`:**

    ```cpp
    template <typename> class CC;

    template <typename T2>
    class CC<B<T2>> {
    public:
        typedef C<T2> type;
    };
    ```

The we get the final deduction guide for C: `auto (T2) -> CC<B<T2>>::type`;

https://github.com/llvm/llvm-project/pull/98788
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to