这是我在某些情况下的示例代码:

//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/vectorrbegin具有两个签名:
 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/

10-11 19:05