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

Что корректный путь состоит в том, чтобы передать всем конструкторам родителя в C++ 0x?

Я делал это:

class X: public Super {
    template<typename... Args>
        X(Args&&... args): Super(args...) {}
};
17
задан Johannes Schaub - litb 1 October 2011 в 14:00
поделиться

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

41
ответ дан 30 November 2019 в 10:58
поделиться

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

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

5
ответ дан 30 November 2019 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: