Cześć,
mam problem z dziedziczeniem konstruktora przenoszącego:
#include <iostream>
class BaseClass
{
public:
BaseClass() {}
BaseClass( const BaseClass &other ) = delete;
BaseClass( BaseClass &&other ) {}
BaseClass &operator=( const BaseClass &other ) = delete;
BaseClass &operator=( BaseClass &&other ) { return *this; }
~BaseClass() {}
static BaseClass Create()
{
return BaseClass();
}
};
class Foo : public BaseClass
{
public:
using BaseClass::BaseClass;
using BaseClass::operator=;
//Foo( BaseClass &&other ) : BaseClass( std::move( other ) ) {}
};
int main()
{
Foo f = Foo::Create();
}
<source>:31:9: error: no viable conversion from 'BaseClass' to 'Foo'
31 | Foo f = Foo::Create();
| ^ ~~~~~~~~~~~~~
<source>:22:7: note: candidate constructor (the implicit copy constructor) not viable: cannot bind base class object of type 'BaseClass' to derived class reference 'const Foo &' for 1st argument
22 | class Foo : public BaseClass
| ^~~
<source>:22:7: note: candidate constructor (the implicit move constructor) not viable: cannot bind base class object of type 'BaseClass' to derived class reference 'Foo &&' for 1st argument
22 | class Foo : public BaseClass
Błąd kompilacji występuje na wszystkich głównych kompilatorach: msvc, gcc, clang.
Problem znika gdy dodam taki konstruktor do klasy Foo
:
Foo( BaseClass &&other ) : BaseClass( std::move( other ) ) {}
Ale nie rozumiem. Przecież using BaseClass::BaseClass
powinno dziedziczyć wszystkie konstruktory?
https://godbolt.org/z/bsK67EbdW
Co ciekawe, operator=
działa poprawnie i się kompiluje.
Foo f;
f = Foo::Create();
https://godbolt.org/z/sG886Yef9
Czy ktoś jest w stanie mi to sensownie wytłumaczyć?