操作符++的正确返回类型
Correct return type for the operator ++
我正在尝试实现List和Iterator类(我们的作业,我们应该以stl风格实现我们自己的列表)。我有一个关于++
算子的问题。在我的实现中,++
不返回任何东西:
void operator++();
但是我的一个朋友是这样实现的:
Iterator& operator++();
我测试了他们两个,似乎他们都工作。但我相信肯定有很大的不同。但是我是c++语言的新手。所以我看不见它。有人能帮帮我吗?
这里的一般约定是重载操作符应该类似于普通操作符。例如,您可以:
int x = 5;
int y = ++x;
所以你的迭代器应该在类似的上下文中可用:
Iterator i = smth.begin();
Iterator j = ++i;
你朋友的版本允许这个
还有一个古老的C笑话:
++i = 0;
所以是的,你的operator ++()
应该返回*this
作为左值来允许这种东西,所以返回类型是Iterator&
而不是Iterator
或const Iterator&
。
不同的是,你朋友的版本可以在
// loop that skips the first element
while (++it != end)
// perform operation
,其中it
是某个迭代器。库函数和客户端代码可能依赖于此,因此总是从重载的operator++
返回*this
。所有标准库迭代器都是这样工作的,它们所基于的指针也是如此。
区别在于,他的操作符可以当作迭代器指针来使用,而你的操作符则不能。对于指针,你可以这样做:
char *p1, *p2;
...
p1 = ++p2;
对于迭代器来说,++
操作符必须返回自增操作符之前(或之后)的值,这取决于操作符的前位或后位。您的实现不会这样做。虽然从技术上讲是可以的,但是结果操作符的功能不太好,因此最好更改实现以返回一个值。
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么模板化的用户定义转换操作符能够确定其返回类型?
- c++模板操作符重载不同类型,自动返回类型
- 赋值操作符的返回类型是什么?
- 重载操作符返回类型
- 如果在调用时没有取赋值操作符的返回类型,将会发生什么?
- 操作符++的正确返回类型
- 使用带有转换操作符的temp. proxy模拟返回类型的类型推导