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

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

Я делал это:

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

Ответ 1

В С++ 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 может преобразовывать любые аргументы, включая массивы символов. Он делает это без учета существующих конструкторов базового класса. Наследование конструкторов с использованием объявлений объявляет только конструкторы, необходимые для выполнения этой работы.

Ответ 2

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

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