我们尝试从某个c++编译器实现的标准库进行分析:
typename std::set<int>::iterator的定义如下:
来看__base的const_iterator:
这就是真正的iterator类,看它的接引用运算符重载:
返回值reference的类型:
是一个const value_type&类型,带有const限定符。
对这样类型的对象进行std::move()操作并不会使得const属性消失,而会得到const value_type&&类型的对象,这个对象不能被非常量的右值引用所绑定,而只能被常量左值引用绑定。
因此避免了触发move而触发了copy。
例子:
std::set<YourClass> s;
s.push(2);
auto tmp = std::move(*s.begin()); // copy , not move.
以上,虽然为了保证逻辑的完整,const T&& 能够绑定到常量的右值,但不建议重载以此类型为参数类型的函数,对方声明为const,及意味着不想被修改,所以不要移动它。
void func(const int&& i) {
std::cout << "1";
}
void func(const int& i) {
std::cout << "2";
}
调用func(2),会输出1,即对于右值(无论是常量的还是非常量的)来说,常量右值引用的匹配优先级高于常量左值引用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。