相关疑难解决方法(0)

所有版本的GCC都与默认成员初始化器相媲美,它捕获了这个,并与继承的构造函数相结合

这个故事与我之前的问题类似.支持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;
}
Run Code Online (Sandbox Code Playgroud)

住在godbolt.com上


这段代码用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 …
Run Code Online (Sandbox Code Playgroud)

c++ gcc c++11 inheriting-constructors

10
推荐指数
1
解决办法
420
查看次数

继承构造函数和支撑或相等的初始值设定项

我不明白为什么你不能编译一个既有成员(不是默认可构造)又带有大括号或者相同的初始化器和继承的构造函数的类.g ++说:

test.cpp:22:15:错误:使用已删除的函数'Derived :: Derived(float)'
派生d(1.2f);

test.cpp:16:13:注意:'Derived :: Derived(float)'被隐式删除,
因为默认定义不正确:
使用Base :: Base;

test.cpp:16:13:错误:没有匹配函数调用'NoDefCTor :: NoDefCTor()'
test.cpp:5:1:注意:候选:
NoDefCTor :: NoDefCTor(int)NoDefCTor(int){}

无法编译的代码(在g ++ 5.1下):

struct NoDefCTor
{
    NoDefCTor(int) {}
};

struct Base
{
    Base(float) {}
};

struct Derived : Base
{
    using Base::Base;
    NoDefCTor n2{ 4 };
};

int main()
{
    Derived d(1.2f);
}
Run Code Online (Sandbox Code Playgroud)

编译的代码,但从不使用 NoDefCTor默认构造函数(尽管显然需要它!):

struct NoDefCTor
{
    NoDefCTor(int) {}
    NoDefCTor() = default;
};

struct Base
{
    Base(float) {}
};

struct Derived : Base
{
    using Base::Base;
    NoDefCTor …
Run Code Online (Sandbox Code Playgroud)

c++ constructor c++11 inherited-constructors

9
推荐指数
1
解决办法
286
查看次数