gpt4 book ai didi

c++ - auto 和区分重载方法

转载 作者:行者123 更新时间:2023-11-30 01:13:45 25 4
gpt4 key购买 nike

这是我在某些上下文中的示例代码:

//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 循环中,我希望使用 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";)。

如何autorbegin 的两个版本中挑选.可以让pick第二个版本吗?

最佳答案

作为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++ - auto 和区分重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31362150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com