【发布时间】:2017-08-04 11:44:14
【问题描述】:
我是 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 值。 我从 Comparable 派生了以下类:
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));
但是我得到一个编译错误:
无法将“Tests::Monkey”左值绑定到“const Tests::Monkey&&” 初始化 'virtual int Tests::Monkey::compare(const Tests::Monkey&&)' 的参数 1 构建失败
为什么方法调用没有绑定到基类中的 compare 方法?
当我在基类中将它们都创建为虚拟并在派生类中编写它们时,绑定工作正常,但它不起作用,如果我尝试按照此处编写的方式编译它,则会出现编译错误.
【问题讨论】:
-
我真的不明白你为什么到处使用右值引用。
compare函数的普通 const-reference 可以正常工作。并将右值引用传递给const char*?这真的没有多大意义。最后,常量右值引用通常也没有任何意义。 -
我是 C++ 新手。我认为引用防止复制,这是函数调用的默认行为,所以我认为养成使用它们的习惯并习惯它们可能是一个好习惯。我以前见过 const 引用。虽然它对性能的影响可能可以忽略不计。
-
@JoePaul Reference 也介绍了overhead。 const lvalue 参考在你的情况下会很完美。右值引用主要用于完善转发和移动语义。
标签: c++ binding virtual lvalue rvalue