Эта история похожа на предыдущий вопрос. Все версии GCC, поддерживающие С++ 11, имеют такое точное поведение. Я не мог найти другого компилятора, который борется со своим тестовым случаем.
Тестовый пример:
struct BaseFooWrapper
{
BaseFooWrapper(int qux)
{ }
};
struct Foo
{
Foo(BaseFooWrapper & foo)
: foo(foo)
{ }
BaseFooWrapper & foo;
};
struct SomeFooWrapper : public BaseFooWrapper
{
using BaseFooWrapper::BaseFooWrapper;
Foo foo{*this};
};
int main()
{
SomeFooWrapper wrapped_foo(1);
return 0;
}
Live on godbolt.com
Этот фрагмент кода компилируется с clang (с 3.4 по 4.0), icc (16, 17), Visual С++ (19.00.23506).).
Если я заменил наследование конструктора рукописной версией, то GCC начнет компилировать код:
struct BaseFooWrapper
{
BaseFooWrapper(int qux)
{ }
};
struct Foo
{
Foo(BaseFooWrapper & foo)
: foo(foo)
{ }
BaseFooWrapper & foo;
};
struct SomeFooWrapper : public BaseFooWrapper
{
SomeFooWrapper(int qux)
: BaseFooWrapper(qux)
{ }
Foo foo{*this};
};
int main()
{
SomeFooWrapper wrapped_foo(1);
return 0;
}
Live on godbolt.com
Очевидно, что это не очень удобно, особенно когда у вас много таких классов и приводит к шаблону. В принципе, то, что наследует конструкторы, предназначено для исправления. Такое поведение GCC делает эту замечательную функцию С++ 11 недоступной в таких случаях.
Итак, мне действительно интересно, что я делаю что-то незаконное в отношении стандарта, или это ошибка в GCC?
Edit:
Подано сообщение об ошибке .