我新的C++和試圖寫一個界面,如下方法調用(左值)結合功能(右值):C++中派生類代替基類功能(左值)
template <class T>
class Comparable
{
protected:
Comparable(){};
public:
virtual int compare(const T&&)=0;
int compare(const T& o)
{
return this->compare(std::move(o));
}
};
我確實這試圖讓比較方法與兩個l/r值一起工作。 我得出可比以下類:
class Monkey : Comparable<Monkey>
{
private:
char name[512];
public:
Monkey(const char*&& name)
{
strcpy(this->name, name);
}
const char *getName() { return name; }
int compare(const Monkey&& m)
{
return strcmp(name, m.name);
}
};
與main()方法如下:
Monkey m1(argv[1]), m2(argv[2]);
printf("\"%s\" \"%s\" %d\n", m1.getName(), m2.getName(), m2.compare(m1));
但我得到一個編譯錯誤:
不能結合「試驗::猴'lvalue to'const Tests :: Monkey & &' 初始化參數1'虛擬int測試::猴::比較(const Tests :: Monkey & &)' 構建失敗
爲什麼該方法調用不綁定到基類中的比較方法?
當我在基類中將它們都創建爲虛擬類型並將它們都寫入派生類時,綁定工作正常,但它不起作用,並且如果我嘗試編譯它時會發生編譯錯誤這裏。
我真的不明白爲什麼你用右值引用到處。 「比較」函數的正常const引用可以很好地工作。並將右值引用傳遞給'const char *'?這確實沒有多大意義。最後,不變的右值引用通常也沒有意義。 –
我是新來的C++。我認爲引用可以防止複製,這是函數調用的默認行爲,所以我認爲,習慣使用它們並習慣它們可能是一種好習慣。我以前見過const引用。儘管它的性能影響可能可以忽略不計。 –
@JoePaul引用也引入了[overhead](http://stackoverflow.com/questions/8250932/what-is-the-overhead-of-passing-a-reference)。在你的情況下,const的左值引用會做perferect。右值引用主要用於完美轉發和移動語義。 – felix