Как написать правильный конструктор std :: initializer_list - PullRequest
0 голосов
/ 20 декабря 2018

Рассмотрим следующий код:

#include <iostream>
#include <vector>

struct C {
    std::vector<int> a;
    std::string b;
    bool c;
};

void printC(const C &c) {
    // ...
}

int main() {
    printC({
        { 1, 2, 3 },
        "ehlo",
        false
    });
}

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

struct C {
    std::vector<int> a;
    std::string b;
    bool c;

    C() {
        c = false;
    }
};

Вызов printC перестает работать, потому что компилятор прекращает генерировать соответствующий конструктор.Я пытался написать себе конструктор, используя std :: initializer_list, но потерпел неудачу.

Итак, вопрос в том, как написать конструктор, который заставит вышеуказанный код компилироваться и работать снова?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Вы можете передать экземпляр std::initializer_list<int> следующим образом:

#include <initializer_list>

struct C {
    /* Data members... */

    C(std::initializer_list<int> vecData, std::string str, bool flag) :
        a{vecData}, b{std::move(str)}, c{flag} {}
};
0 голосов
/ 20 декабря 2018

Стоит отметить, что в C ++ 14 и более поздних версиях вы можете просто использовать инициализатор члена по умолчанию:

struct C {
    std::vector<int> a;
    std::string b;
    bool c = false;
};

Кроме того, агрегатная инициализация не создает конструкторов.Он полностью их обходит.

0 голосов
/ 20 декабря 2018

Я пытался написать конструктор, используя std :: initializer_list, но не смог.

Вам не нужен.Вам просто нужно, чтобы c'tor брал вектор, строку и логическое значение:

C(std::vector<int> a, std::string b, bool c) 
  : a(std::move(a))
  , b(std::move(b))
  , c(c) {
}

Теперь ваш код должен быть правильно сформирован.Хотя теперь он выполняет две операции перемещения, в то время как исходная агрегатная версия могла бы инициализировать элементы вашего объекта напрямую.Это стоит рассмотреть.

...