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