C++右值引用与函数返回值

大一的时候在matrix上打的一道题目, 出现了迷之BUG, 后来请教了助教, 是右值引用的问题.

bool operator != (simple_iterator &a)
{
    return *pointer != *a.pointer;
} 
for (iter = ivec.Begin(); iter != ivec.End(); ++iter)
    cout << *iter;

出错的地方就在for循环编译错误.
原因:
C++中函数的非引用返回值是一个右值(临时对象, 只可以出现在等号右边, 不能访问地址), C++11之前是没有右值引用的, C++11之后增加了右值引用, 例如const int &a = 5; 但是上面的代码中不符合右值引用的语法规定(少了const), 所以编译会报错, 就是这么简单.

另外总结一下运算符的优先级和结合性(因为写这篇博客的时候硬是看了半天上面的*a.pointer没看懂…)
优先级:https://blog.csdn.net/lfb_2048/article/details/62040608
就上面的例子来讲, (.)的优先级是大于(*)的优先级, 所以*a.pointer相当于*(a.pointer).

结合性: 在优先级相同的情况下, 由结合性决定先后执行顺序, 例如: a = b = c, (=)的结合性为从右向左, 也就相当于 a = (b = c).

你可能感兴趣的:(C++的坑)