2014-05-06 59 views
13

我有麻煩來實現下面的代碼實現方法與裁判預選賽

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(); 
} 

的問題是,我不能叫getVectorgetVectorAndMore因爲this不是右值。爲了編譯代碼,我必須投入this

是否有很好的方法來實現這樣的代碼?


return getVector();

錯誤消息是

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

順便說一句,此代碼編譯罰款(與'鐺3.4'):http://coliru.stacked-crooked.com/a/911ce206d19eea5c – Nawaz

+0

@Nawaz我的意思是這個版本http://coliru.stacked-crooked.com/a/23aa6a4a4e8d07c4。我知道什麼是錯誤,我知道它爲什麼失敗,我知道如何解決它,我想問一個更好的方法來修復它 –

回答

13
return getVector(); // not compile 

這相當於此:

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

哪些不會編譯,因爲this是一個左值,而不是右值,getVector()只能在右值調用,因此錯誤。

注意this總是一個左—甚至內部右值-REF成員函數!


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

這是調用getVector()的正確方法。

+0

所以你說沒有更好的方法? –

+0

@BryanChen。號碼:-) – Nawaz

+1

多數民衆贊成在非常不高興:-( –