这个故事与我之前的问题类似。所有支持C++11的 GCC 版本都具有这种确切的行为。我找不到任何其他与我的测试用例作斗争的编译器。
测试用例:
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;
}
这段代码使用clang(3.4 到 4.0)、icc(16、17)、Visual C++(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;
}
显然它不是很方便,特别是当你有很多这样的类,并导致样板代码。基本上,继承构造函数旨在解决的问题。在这种情况下,GCC 的这种行为使这个很棒的c++11功能不可用。
所以我真的很好奇我是否在做违反标准的事情,或者这是 GCC 中的错误?
编辑:
提交了错误报告。