Пересылка всех конструкторов в C ++ 0x - PullRequest
17 голосов
/ 25 июня 2010

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

Я делал это:

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

Ответы [ 2 ]

41 голосов
/ 25 июня 2010

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

5 голосов
/ 25 июня 2010

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

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

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