我如何获得一个const_iterator使用自动?

第一个问题:是否有可能“强制”一个const_iterator使用自动? 例如:

 map<int> usa; //...init usa auto city_it = usa.find("New York"); 

我只是想查询,而不是改变city_it指出的任何东西,所以我想有city_itmap<int>::const_iterator 。 但是通过使用auto, city_itmap::find()的返回types是一样的,它是map<int>::iterator 。 任何build议?

对不起,但我只是觉得最好的build议是根本不使用auto ,因为你想执行(隐式有效) types转换auto是为了推断确切的types ,这不是你想要的。

只要这样写:

 std::map<std::string, int>::const_iterator city_it = usa.find("New York"); 

正如MooingDuck指出的那样,使用types别名可以提高代码的可读性和可维护性:

 typedef std::map<std::string, int> my_map; my_map::const_iterator city_it = usa.find("New York"); 

与@ Jollymorphic的答案相比,这不是一个完全不同的转换为const的方法,但是我认为有这样一个实用的单线程函数是很方便的:

 template<class T> T const& constant(T& v){ return v; } 

这使得转换更吸引眼球:

 auto it = constant(usa).find("New York"); // other solutions for direct lengths comparision std::map<std::string, int>::const_iterator city_it = usa.find("New York"); auto city_it = const_cast<const std::map<std::string, int>&>(usa).find("New York"); 

那么,我会说,更大并不总是更好。 你当然可以根据你的喜好select函数的名字 – as_const或者const_是可能的select。

使用auto的另一个变体(保持可变的美国和常量美国):

 map<std::string, int> usa; //...init usa const auto &const_usa = usa; auto city_it = const_usa.find("New York"); 

如果init之后不需要映射是可变的,还有一些其他选项。

您可以将usa定义为const,并使用函数调用来初始化它:

 const map<std::string, int> usa = init_usa(); auto city_it = usa.find("New York"); 

或者使用lambda来初始化一个常量映射:

 const auto usa = [&]()->const map<std::string, int> { map<std::string, int> usa; //...init usa return usa; }(); auto city_it = usa.find("New York"); 

一个干净的解决scheme是使用一个const引用到另外可修改的映射:

 const auto &const_usa = usa; auto city_it = const_usa.find("New York"); 

这将确保你不能修改const_usa ,并使用const迭代器。

我现在无法testing这个function,但是我认为它可以做到这一点:

 auto city_it = const_cast< const map<int> & >(usa).find("New York"); 

既然C ++ 17可以像这样使用std::as_const

 #include <utility> // ... auto city_it = std::as_const(usa).find("New York"); 

你可以使用自动“追踪”一个types或“推导”一个types: // deduce auto city_it = usa.find("New York");

// track auto city_it = std::map<int>::const_iterator( usa.find("New York"));

此外,手表是由Herb Sutter的现代c ++风格的谈话,涵盖了大部分这些types的扣除指导。 https://youtu.be/xnqTKD8uD64