В C ++ 11 и выше, есть ли способ инициализировать вектор в списке инициализаторов? - PullRequest
0 голосов
/ 20 июня 2020

Для класса, содержащего вектор строк, предположим, нам нужен конструктор, который может передавать либо список, либо одно значение. Как второй конструктор может вызвать первый в списке инициализаторов?

class A {
private:
  std::vector<const char*> paths;
public:
  A(std::vector<const char*>& paths) : paths(paths) {}
  A(const char* p) : A(std::vector<const char*>( { p } ) {}
};

Второй конструктор недопустим. Не могу придумать синтаксис.

A(const char* p) : A( {p} ) {}

Тоже не то.

1 Ответ

1 голос
/ 20 июня 2020

Вы создаете временный вектор, поэтому вы должны использовать ссылку const в своем первом конструкторе:

class A {
private:
  std::vector<const char*> paths;
public:
  A(const std::vector<const char*>& paths) : paths(paths) {}
  A(const char* p) : A(std::vector<const char*>{ p }) {}
};

В качестве альтернативы подумайте об использовании ссылки на r-значение:

class A {
private:
  std::vector<const char*> paths;
public:
  A(std::vector<const char*>&& paths) : paths(std::move(paths)) {}
  A(const char* p) : A(std::vector<const char*>{ p }) {}
};
...