скобки, обозначающие элементы после структурного типа A {a, b, c} - PullRequest
2 голосов
/ 24 апреля 2019

Что означает передача объектов в скобках после типа структуры, когда он не ссылается на атрибуты структуры или аргументы своего собственного конструктора.

template <class... Ts> // (1)
struct Print : Ts... {
    using Ts::operator()...;
};

template <class... Ts> // (1)
auto MakePrint(Ts... ts) {
    return Print<Ts...>{ts...};
}

ts... в последней строке, выполнение этого кода без него дает точно такой же результат, но я не понимаю, почему он компилируется: s

Единственные две интерпретации, которые я знаю об использовании скобок, - это установить атрибуты структуры или вызвать конструктор структуры

Но в этом случае, например, с:

auto m = MakePrint ([](int i){ return i + 1;});

Это эквивалентно:

auto MakePrint (typeof(lambda) lambda) {
   return Print<typeof(lambda)>{lambda};
}

и Печать определяется следующим образом:

struct Print : typeof(lambda) {
    auto operator() (int i) { return i + 1; }
}

и так куда же попадает лямбда-объект внутри скобок (возврат Print<typeof(lambda)>{lambda};)?

1 Ответ

3 голосов
/ 24 апреля 2019

Начиная с C ++ 17 агрегатов могут иметь базовые классы.Так как Print наследуется от Ts.., то

Print<Ts...>{ts...}

создает объект Print и инициализирует все базовые классы экземпляром каждого базового класса.Глядя на расширенный простой пример, ваш код в основном такой же, как

struct foo
{
    int f;
};

struct bar : foo {};

int main()
{
    foo f{42};
    bar b{f};
}

, где b 'foo часть инициализируется f.

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