Пересылка всех конструкторов в C++0x

Как правильно переслать все конструкторы родителя в C++0x?

Я делал это:

class X: public Super {
    template<typename... Args>
        X(Args&&... args): Super(args...) {}
};

2 ответа

Решение

Есть лучший способ в C++0x для этого

class X: public Super {
  using Super::Super;
};

Если вы объявите шаблон с идеальной пересылкой, ваш тип будет плохо работать в разрешении перегрузки. Представьте, что ваш базовый класс является конвертируемым из int и существуют две функции для распечатки классов

class Base {
public:
  Base(int n);
};

class Specific: public Base {
public:
  template<typename... Args>
    Specific(Args&&... args);
};

void printOut(Specific const& b);
void printOut(std::string const& s);

Вы называете это с

printOut("hello");

Что будет называться? Это неоднозначно, потому что Specific может конвертировать любой аргумент, включая массивы символов. Это происходит без учета существующих конструкторов базового класса. Наследование конструкторов с использованием объявлений только объявляет конструкторы, которые необходимы для этой работы.

Я думаю тебе нужно сделать Super(std::forward<Args>(args)...) если вы хотите, чтобы вещи пересылались правильно. args имеет имя, поэтому я верю, что оно будет связываться с обычными ссылками перед ссылками rvalue.

Что еще более важно, вы не будете пересылать конструкторы копирования таким образом. Компилятор все равно сгенерирует его для вас, потому что он не учитывает конструкторы шаблонов. В приведенном примере все в порядке, потому что сгенерированный компилятором так или иначе просто вызовет родительский конструктор копирования, а это именно то, что вам нужно. Если это не подходит в более сложном случае, то вам придется написать это самостоятельно.

Другие вопросы по тегам