这是我在某些情况下的示例代码:
//tac.cc
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
auto lines = vector<string>{};
for(auto line = string{}; getline(cin,line); ){
lines.emplace_back(line);
};
//vector<string>::const_reverse_iterator cit = lines.rbegin();
//auto cit = lines.rbegin();
for(
decltype(lines)::const_reverse_iterator cit = lines.rbegin();
cit != lines.rend();
++cit){
cout<< *cit << endl;
};
return 0;
}
在第二个for循环中,id希望在从
auto
中获取一个const_reverse_iterator
的同时,拥有rbegin()
的简洁性。根据http://www.cplusplus.com/reference/vector/vector/rbegin/,
vector
的rbegin
具有两个签名: reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;
如果我使用
auto cit = lines.rbegin();
我得到了
rbegin
的非常量版本,因为编译器随后让我在没有警告的情况下修改了 vector (例如*cit = "foo";
)。auto
如何从rbegin
的两个版本中选取。可以选择第二个版本吗? 最佳答案
正如0x499602d2所指出的,C++ 14中有cr?[begin|end]*
系列。实际上,您的代码基本上以Scott Meyer's Effective Modern C++(第13项)的形式出现。
暂时,您可以在调用时将“lines
”强制为“const
”,如下所示:
auto cit = ((const decltype(lines) &)lines).rbegin();
尽管还有其他方法不涉及
decltype
,但我喜欢这种方法,因为它对于以后lines
类型的更改是不变的。关于c++ - 自动和区分重载方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31362150/