Следующее может скомпилироваться под С++ 17
template<class... Ts>
struct Test : Ts...
{
using Ts::operator()...;
};
template<class... Ts> Test(Ts...) -> Test<Ts...>;
int main() {
Test test
{
[](const int& i) { },
[](const float& f) { }
};
}
Но если я изменю его на:
Test test
( //{ is changed to (
[](const int& i) { },
[](const float& f) { }
);//} is changed to )
Он не скомпилируется, потому что в Test нет такого конструктора, который принимает 2 параметра. Мне интересно, почему исходный код работает?
@cpplearner Test не имеет члена данных, как здесь работает агрегатная инициализация?





Потому что агрегатная инициализация становится более странной в C++17. По сути, если вы агрегируете-инициализируете класс с одним или несколькими общедоступными базовыми классами, первые элементы списка инициализаторов используются для инициализации базовых классов. В этом случае, после вывода аргументов шаблона, базовые классы могут быть правильно инициализированы из лямбда-аргументов, используя их конструкторы копирования по умолчанию.