2014-05-06 11 views
13

ho difficoltà ad attuare seguente codiceimplementare il metodo di qualificazione rif

template <class T> 
struct Foo 
{ 
    std::vector<T> vec; 

    std::vector<T> getVector() && { 
     // fill vector if empty 
     // and some other work 
     return std::move(vec); 
    } 

    std::vector<T> getVectorAndMore() && 
    { 
     // do some more work 
     //return getVector(); // not compile 
     return std::move(*this).getVector(); // seems wrong to me 
    } 
}; 

int main() 
{ 
    Foo<int> foo; 

    auto vec = std::move(foo).getVectorAndMore(); 
} 

Il problema è che non riesco chiamo getVector all'interno getVectorAndMore perché this non è rvalue. Per rendere il codice compilato, ho dovuto trasmettere this al valore.

È un buon modo per implementare tale codice?


con return getVector();

messaggio di errore è

main.cpp:17:16: error: cannot initialize object parameter of type 'Foo<int>' with an expression of type 'Foo<int>' 
     return getVector(); // not compile 
       ^~~~~~~~~ 
main.cpp:26:31: note: in instantiation of member function 'Foo<int>::getVectorAndMore' requested here 
    auto vec = std::move(foo).getVectorAndMore(); 
          ^
1 error generated. 

Coliru

+0

BTW, questo codice compila bene (con 'Clang 3.4'): http://coliru.stacked-crooked.com/a/911ce206d19eea5c – Nawaz

+0

@Nawaz intendo questa versione http://coliru.stacked-crooked.com/a/23aa6a4a4e8d07c4. So qual è l'errore, so perché non è riuscito, so come risolverlo, sto chiedendo un modo migliore per risolverlo –

risposta

13
return getVector(); // not compile 

Ciò equivale a questo:

return this->getVector(); // not compile 

che non si compila, perché this è un lvalue, non un valore di rvalore e getVector() può essere invocato solo su rvalue, quindi l'errore.

noti che this è sempre un lvalue — anche all'interno funzione membro rvalue-ref!


return std::move(*this).getVector(); 

Questo è il modo corretto per invocare getVector().

+0

quindi stai dicendo che non c'è modo migliore? –

+0

@BryanChen. No. :-) – Nawaz

+1

questo è molto turbato :-( –

Problemi correlati