странное поведение вывода аргумента шаблона

#c #c 17

#c #c 17

Вопрос:

Следующее может быть скомпилировано под c 17

 template<class... Ts>
struct Test : Ts...
{
    using Ts::operator()...;
};

template<class... Ts> Test(Ts...) -> Test<Ts...>;


int main() {

    Test test
    {
        [](const intamp; i) {  },
        [](const floatamp; f) {  }
    };
}
  

Но если я изменю его на :

     Test test
    ( //{  is changed to (
        [](const intamp; i) {  },
        [](const floatamp; f) {  }
    );//}  is changed to )
  

Он не будет компилироваться, потому что у Test нет такого конструктора, который принимает 2 параметра.Мне интересно, почему работает исходный код?

Комментарии:

1. агрегированная инициализация

2. В тесте @cpplearner нет элемента данных, как здесь работает агрегированная инициализация?

Ответ №1:

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