Наследование конструкторов в C ++ 0x - PullRequest
8 голосов
/ 23 марта 2011

Допустим, у меня есть следующий код в том, что мы ожидаем стать следующим стандартом C ++:

int f(int x) 
{ 
  std::cout << x;
  return x * x; 
}

struct A
{
  A(int x) : m_x(x) {}
  int m_x;
};

struct B : A
{
  using A::A;
  B() : m_y(f(m_x)) {}
  int m_y;
};

int main()
{
  B(5);
}

Будет ли это вызывать конструктор по умолчанию B и распечатать 5 и установить m_y = 25? Или конструктор по умолчанию B не запустится и оставит m_y не инициализированным?

И если последнее, то в чем причина не вызывать конструктор B по умолчанию? Совершенно ясно, что A (int) B наследует только инициалы A и оставляет B в неопределенном состоянии. Почему C ++ выбирает неопределенное поведение вместо простого вызова конструктора по умолчанию B ()? Это в значительной степени противоречит цели функции наследующих конструкторов.

Edit:

Возможно, это должно быть разрешено:

using A::A : m_y(...) { std::cout << "constructing..." << std::endl; ...; }

1 Ответ

4 голосов
/ 23 марта 2011

using A::A; неявно объявляет B(int) в производном классе.Вот и все.

Остальная часть вашей программы не должна работать так, как вы ожидаете.Потому что вы вызываете B(int) с B(5), а m_y остается неинициализированным.

Смотрите этот пример с сайта Бьярна Страуструпа:

struct B1 {
    B1(int) { }
};

struct D1 : B1 {
    using B1::B1; // implicitly declares D1(int)
    int x;
};

void test()
{
    D1 d(6);    // Oops: d.x is not initialized
    D1 e;       // error: D1 has no default constructor
}

http://www2.research.att.com/~bs/C++0xFAQ.html#inheriting

Другой пример по той же ссылке:

struct D1 : B1 {
        using B1::B1;   // implicitly declares D1(int)
        int x{0};   // note: x is initialized
    };

    void test()
    {
        D1 d(6);    // d.x is zero
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...