странное поведение вывода аргумента шаблона - PullRequest
0 голосов
/ 02 марта 2019

Следующее может компилироваться под c ++ 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 параметра. Мне интересно, почему оригинальный код работает?

1 Ответ

0 голосов
/ 02 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...