C++ Primer:对begin()的引用
1. 问题
// 编译环境:MinGW
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v{1, 2, 3};
vector<int>::iterator i1 = v.begin();
//问题:为何i2报错,而i3无错?
vector<int>::iterator &i2 = v.begin();
const vector<int>::iterator &i3 = v.begin();
return 0;
}
2. 分析与解答
i3是常量引用,i2是对非常量的引用。
vector
::iterator &i2 = v.begin();
const vector::iterator &i3 = v.begin(); v.begin()实际上返回一个右值的临时变量,非常量引用不能绑定临时变量。故i2报错,i3无错。
3. 拓展
3.1 实例1
// 编译环境:MinGW
#include <iostream>
using namespace std;
int main()
{
int i = 0;
//为何(i++) = 1;报错,而(++i) = 1;无错?
(i++) = 1;
(++i) = 1;
return 0;
}
解答:
i++返回一个右值的临时变量,右值不可赋值。
(i++) = 1;
++i返回一个左值的临时变量,左值可修改。
(++i) = 1;
3.2 实例2
// 编译环境:MinGW
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v{1, 2, 3};
vector<int>::iterator i1 = v.begin();
// vector<int>::iterator &i2 = v.begin();
const vector<int>::iterator &i3 = v.begin();
//问题:v.begin()返回右值,为何可以在等号左边?
cout << *v.begin() << endl;
v.begin() = v.begin() + 1;
cout << *v.begin() << endl;
return 0;
}
解答:
v.begin()返回的临时变量是类类型,它可以调用其成员函数,实际如下表达式中的”=”不是在赋值,而是在调用成员函数。
v.begin() = v.begin() + 1;
4. 总结
- 只有常量引用才能绑定临时变量,非常量引用不行。
- 临时变量是右值时,不可以赋值,但可以调用成员函数。或者说内置类型的右值临时变量不可以赋值,类类型的右值临时变量可以通过调用其成员函数是实现赋值。
还没有评论,来说两句吧...