You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Currently after compiling the following code:
```cpp
value: <T: type, Y: type, Z: type> type = {
public data1: T;
public data2: Y;
public data3: Z;
operator=: (out this, out t: T, inout y: Y, z: Z) = {
t = 42;
data1 = t;
data2 = y;
data3 = z;
}
operator=: (out this, t: * const T, y: *Y, move z: Z) = {
data1 = t*;
data2 = y*;
data3 = z;
}
}
main: () = {
i : int;
s := std::string("lvalue string");
v: value = (out i, s, :std::string = "temporary string");
std::cout << "(v.data1)$, (v.data2)$, (v.data3)$" << std::endl;
s = "will be moved";
w: value = (v.data1&, v.data2&, move s);
std::cout << "(w.data1)$, (w.data2)$, (w.data3)$" << std::endl;
}
```
We will get the following error:
```
../tests/ctad.cpp2... ok (all Cpp2, passes safety checks)
../tests/ctad.cpp2:22:11: error: no viable constructor or deduction guide for deduction of template arguments of 'value'
value v {&i, s, std::string{"temporary string"}};
^
../tests/ctad.cpp2:12:13: note: candidate template ignored: couldn't infer template argument 'T'
public: value(cpp2::in<T const*> t, cpp2::in<Y*> y, Z&& z);
^
../tests/ctad.cpp2:6:13: note: candidate template ignored: could not match 'cpp2::out<T>' against 'cpp2::deferred_init<int> *'
public: value(cpp2::out<T> t, Y& y, cpp2::in<Z> z);
^
../tests/ctad.cpp2:1:52: note: candidate function template not viable: requires 1 argument, but 3 were provided
template<typename T, typename Y, typename Z> class value {
^
1 error generated.
```
After this change cppfront generates Class template argument deduction (CTAD)
for template class that has constructors with the same argument type list
as template arguments (order matters). cppfront will add the following
cpp1 code to `Cpp2 type definitions and function declarations` section:
```cpp
template<typename T, typename Y, typename Z> value(cpp2::deferred_init<T>*, Y&, Z const &) -> value<T, Y, Z>;
template<typename T, typename Y, typename Z> value(T const* const &, Y* const &, Z&&) -> value<T, Y, Z>;
```
And will make the code compile and run successfuly:
```
42, lvalue string, temporary string
42, lvalue string, will be moved
```
0 commit comments