#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, используя их конструкторы копирования по умолчанию.