It seems like when T1 is constchar(&)[6] both constructors ends up having the same signature Group(constchar(& t1)[6]) (because of the reference collapsing rules) and this is an error because you're only allowed to define the same constructor once.
This way you don't need to use std::remove_reference inside Group. Instead std::remove_reference is used inside makeGroup. You can store references in Group if you want by constructing it directly without using makeGroup. I think this is more similar to how std::tuple/std::make_tuple works, although std::tuple also uses deduction guides to make CTAD prefer non-reference types which is something that you might also want to do.
Since C++20 you can also use normal parentheses: char arr[6]('a', 'b', 'c');
Sorry to derail this thread, but why would they add another syntax complication like that as a feature? What problem is that solving? Isn't the syntax of this language complicated enough?
As you can tell, I am very much not up-to-date on the latest C++20/23 stuff, embarrassingly so.
To allow std::make_unique and similar functions to initialize aggregates.
Example:
1 2 3 4 5 6 7
struct Point
{
int x;
int y;
};
auto p = std::make_unique<Point>(1, 2);
This code did not work in C++17 because std::make_unique uses parentheses to initialize the object but Point is an aggregate and had to be initialized using curly brackets.