关于在成员重载中使用 std::move() 的问题
Question about the usage of std::move() in member overloading
这个问题来自C++入门(第5版(,这是第15章的最后一个主题模拟虚拟副本。
定义两个按继承相关的分类:
class Quote{
public:
virtual Quote* clone() const & {return new Quote(*this);}
virtual Quote* clone() && {return new Quote(std::move(*this));}
//other members
};
class Bulk_quote: public Quote{
public:
Bulk_quote* clone() const& {return new Bulk_quote(*this);}
Bulk_quote* clone() && {return new Bulk_quote(std::move(*this));}
//other members
};
以及雇用他们的班级:
class {
public:
void add_item(const Quote& sale) //copy the given object
{ items.insert(std::shared_ptr<Quote>(sale.clone()));}
void add_item(Quote&& sale) //move the given object
{items.insert(std::shared_ptr<Quote>(std::move(sale).clone()));}
//other memebers
private:
static bool compare(const std::shared_ptr<Quote>& lhs,const std::shared_ptr<Quote>& rhs)
{return lhs->isbn() < rhs->isbn();}
std::multiset<std::shared_ptr<Quote>,decltype(compare)*> items(compare);
};
我陷入了两个观察:
(1( 为什么std::move(*this)
成员virtual Quote* clone()&&
的定义?据我了解,这个版本只能在引用限定符&&
下的可修改的 rvalue(例如,时间对象(上运行。std::move(*this)
可以被*this
取代吗?
(2(与(1(类似,为什么在第二个定义中std::move(sale)
成员add_item
只能在右值对象上运行。对于右值引用Quote&& sale
只能绑定到右值,std::move(sale)
必要吗?
对于调用add_item
的第二个版本,该书说"虽然销售类型是右值引用类型,但销售(像任何其他变量一样(是左值"。但是,如果 verisonvoid add_item(const Quote& sale)
是左值,则将调用sale
。谁能帮助我?
您似乎将对象与表达式混淆了。值类别(左值或右值(是表达式的属性,而不是对象的属性,因此,例如,即使*this
引用临时对象,它作为表达式仍然是左值。sale
也是如此。
确定表达式是左值还是右值需要复杂的规则。示例的相关规则如下:
-
形式
*expr
的表达式始终是左值; -
作为表达式的变量的非限定名始终是左值。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 关于在成员重载中使用 std::move() 的问题
- template_back和move赋值构造函数存在问题
- "used after it was moved [bugprone-use-after-move]"警告在这里是一个真正的问题吗?