Já bych zkusil normální IClipboardReader reader = slot; Ale nenapsal jste ani co je to za jazyk. Vypadá to sice jako C++, ale co když je to něco jiného…
Je to C++, takže
IClipboardReader reader = slot; nebude fungovat.
IClipboardReader je abstraktní třída (interface). Nedají se od ní vytvářet instance. Jdou jenom pointery a reference. A samotná instance musí být něco odvozeného.
Fungovat bude třeba :
IClipboardReader &reader = slot;
IClipboardReader *reader = &slot;
IClipboardReader reader = slot;
dělá slicing. Zkopíruje bázovou třídu do nové instance. A protože je abstraktní, tak to nejde. To je ta hláška "cannot instantiate abstract class"
Pro Fortrana :
auto upcasted2 = (IClipboardReader&)slot; // Error: 'IClipboardReader': cannot instantiate abstract class
auto upcasted3 = std::forward<const IClipboardReader&>(slot); // Error: 'IClipboardReader': cannot instantiate abstract class
auto upcasted4 = static_cast<const IClipboardReader&>(slot); // Error: 'IClipboardReader': cannot instantiate abstract class
dělá taky slicing. Auto dělá z referencí hodnoty, pokud se mu neřekne jinak. Dokonce bych řekl, že je to rozumné defaultní chování. C++ není Java. Chování podobné intům je žádoucí.
Druhá věc je, proč ten cast vůbec chcete ručně dělat. Volat metody předka jde i na potomkovi. A pokud budete volat nějakou funkci co bere referenci na předka, tak ten cast udělá překladač sám. Za sebe si nepamatuju, kdy jsem potřeboval ručně castit na předka. Je to fakt vzácné.
Jinak std::forward slouží k forwardování obecných parametrů a k ničemu jinému. Uvnitř je to sice cast, ale nepoužívejte to tak. Pokud nepíšete nějakou optimalizovanou ale zároveň generickou šablonu, tak forward nechcete používat. V běžném kódu se vyskytuje minimálně.