class A{
public:
virtual ~A() {};
};
class B : public A{ };
int main(){
A&& p = B();
dynamic_cast<B&&>(std::move(p));
}
genera l'errore (g ++ 5.2.0):dynamic_cast e riferimento rvalue
error: conversion to non-const reference type 'std::remove_reference<A&>::type& {aka class A&}' from rvalue of type 'A' [-fpermissive]
Si tenta di lanciare std::move(p)
digitare A&
, ma non riesco a capire perché. Avrei pensato che fosse necessario convertire p
come valore di rvalue prima di convertirlo in un riferimento di rvalue, ma se rimuovo lo std::move
lo compilo bene. Da cppreference:
dynamic_cast <new_type> (expression)
simili altre espressioni del cast, il risultato è:
un lvalue se new_type è un tipo di riferimento lvalue (espressione deve essere un lvalue)
un xValue se new_type è un tipo di riferimento di rvalore (espressione può essere lvalue o rvalore)
Anche 5.2.7 di N3337:
dynamic_cast<T>(v)
Se T è un tipo di puntatore, V è un prvalue di un puntatore a completare tipo di classe, e il risultato è un prvalue di tipo T Se T è un tipo di riferimento di lvalue, v deve essere un lvalue di un tipo di classe completo e il risultato è un lvalue del tipo di cui al T. Se T è un tipo di riferimento di rvalore, v deve essere un'espressione avente un completa il tipo di classe e il risultato è un valore x del tipo indicato da T.
L'unico requisito è che io uso un tipo di classe completo, che è std::move(p)
, non è vero?
Clang non ha avuto problemi con il codice – Cubbi
Confermato con gcc 5.3. Funziona senza la chiamata 'std :: move', comunque. ;) – erip
... come hai notato nella tua domanda.Dovrei leggere le domande più a fondo. – erip