В примечаниях к выпуску последнего обновления Visual Studio (15.7) Microsoft заявляет (9-ая точка):
Наследование конструктора теперь работает так же, как и наследование любого другого члена базового класса. Ранее это работало, объявляя новый конструктор, который делегирует оригиналу; с этим изменением конструкторы базового класса видны в производном классе, как если бы они были конструкторами производного класса, улучшая согласованность в C ++.
Я немного запутался, что на самом деле означает эта точка.
AFAIK, наследование конструктора требует явного using BaseClass::BaseClass;
(начиная с C ++ 11):
struct Base
{
Base() = default;
Base(int x) : x(x) {}
int x;
};
struct Derivative : Base
{
using Base::Base;
Derivative(int x, int y) : Base(x), y(y) {}
int y;
};
void main()
{
Derivative x(10); // this is ok
}
Мое понимание этой цитаты состоит в том, что MS допускает наследование конструктора без необходимости using BaseClass::BaseClass;
. Но тестирование следующего кода после применения обновления, похоже, ничего не меняет в этом отношении:
struct Base
{
Base() = default;
Base(int x) : x(x) {}
int x;
};
struct Derivative : Base
{
int y{};
};
void main()
{
Derivative x(10); // still illegal, compiler error
}
Мои вопросы:
- Что на самом деле означает цитата? Что изменилось?
- Как это улучшает согласованность в C ++ (AFAIK, стандарт ничего не изменил с точки зрения наследования ctor)?