c++ - 如何实现 const_auto,因为 C++11 缺少它?

标签 c++ c++11 auto const-iterator

auto C++11 的类型很方便,所以现在需要一个 const_auto也打字。例如,假设 std::list<T> a; , 如果

auto p = a.begin();

具有类型 std::list<T>::iterator ,那么人们希望

const_auto p = a.begin();

有类型 std::list<T>::const_iterator .不幸的是,C++11 似乎没有听说过const_auto。 .因此,请问如何才能以好的风格达到预期的效果?

(有关信息,a related question is asked and answered here.)

最佳答案

C++11 允许你写

const auto p = a.begin();

但是,这并不能满足您的要求。这使得一个常规迭代器指向其值无法更改的非常量数据。

右侧 a.begin() 的类型由 a 的类型决定,而不是由左侧的任何内容决定。如果 a 是非常量,则 a.begin() 的非常量版本将被调用。因此,您可以将 a 转换为 const& 然后使用它,或者您可以对 a 进行常量引用并使用它:

const auto& b = a;
auto p = b.begin();

但是,更简单的方法是使用新引入的 .cbegin() 和 .cend():

auto p = a.cbegin();

关于c++ - 如何实现 const_auto,因为 C++11 缺少它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17246424/

相关文章:

c++ - 数组索引时的枚举类性能

C++ 套接字、多线程和输出处理

c++ - C++ 中的抽象语法树表示

c++ - 仅在具有零参数模板的头文件中定义 C++ 全局函数?

c++ - 当由 ""推导时, `auto` 的确切类型是什么?

c++ - 没有定义的自动变量声明

c++ - 如何从外部应用程序读取使用 FireFox 下载的文件的源 URL?

c++ - 属性 "deprecated"到 C++17 中的命名空间

c++ - g++-5.1.1 仅在使用优化标志时警告未使用的变量

c++ - 是否可以使用默认泛型参数在 C++ 中定义 lambda?