Наследование конструкторов в C ++ 0x

Допустим, у меня есть следующий код, который, как мы ожидаем, станет следующим стандартом 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 ()? Это в значительной степени противоречит цели наследования конструкторов.

Изменить:

Возможно, это следует разрешить: есть идеи, как это исправить?

5
задан Ricardo Sanchez 23 March 2011 в 10:09
поделиться