我正在使用一个适配器来使用基于范围的 for 循环进行反向迭代。(我不知道用于此目的的升压适配器(“适配器”)。如果它是我已经下载的免费轮子,我坚信不要重新发明轮子。)
令我困惑的是为什么 VC++ 2012 不高兴,除非我在下面的代码中使用尾随返回类型:
#include <string>
#include <iostream>
template<class Fwd>
struct Reverser {
const Fwd &fwd;
Reverser<Fwd>(const Fwd &fwd_): fwd(fwd_) {}
auto begin() -> decltype(fwd.rbegin()) const { return fwd.rbegin(); }
auto end() -> decltype(fwd.rend()) const { return fwd.rend(); }
};
template<class Fwd>
Reverser<Fwd> reverse(const Fwd &fwd) { return Reverser<Fwd>(fwd); }
int main() {
using namespace std;
const string str = ".dlrow olleH";
for(char c: reverse(str)) cout << c;
cout << endl;
}
当我尝试以下操作时,我得到了错误,“错误 C2100:非法间接”和“错误 C2228:'.rbegin' 的左侧必须有类/结构/联合”。我错过了什么?
template<class Fwd>
struct Reverser {
const Fwd &fwd;
Reverser<Fwd>(const Fwd &fwd_): fwd(fwd_) {}
decltype(fwd.rbegin()) begin() const { return fwd.rbegin(); }
decltype(fwd.rend()) end() const { return fwd.rend(); }
};
更新:根据关于“this”指针的讨论,我尝试了另一种方法。看妈,不是这个!它编译得很好。我确实相信,无论对错,VC++ 都没有意识到这一点。
template<class Fwd>
struct Reverser {
const Fwd &fwd;
Reverser<Fwd>(const Fwd &fwd_): fwd(fwd_) {}
decltype(((const Fwd*)0)->rbegin()) begin() const { return fwd.rbegin(); }
decltype(((const Fwd*)0)->rend()) end() const { return fwd.rend(); }
};
更新 3:这个问题自 VC++ 2015 起已修复。谢谢,微软人。