const_iterator类型的const类型的容器

时间:2016-04-09 16:53:27

标签: c++ stl containers

如果我编译下面的代码:

#include <list>

using iter_t = std::list<const unsigned>::const_iterator;

int main(int, char**) {
  return 0;
}

我收到以下编译错误:

In file included from /usr/local/Cellar/gcc/4.9.2_1/include/c++/4.9.2/x86_64-apple-darwin13.4.0/bits/c++allocator.h:33:0,
             from /usr/local/Cellar/gcc/4.9.2_1/include/c++/4.9.2/bits/allocator.h:46,
             from /usr/local/Cellar/gcc/4.9.2_1/include/c++/4.9.2/list:61,
             from main.cpp:1:
/usr/local/Cellar/gcc/4.9.2_1/include/c++/4.9.2/ext/new_allocator.h: In instantiation of 'class __gnu_cxx::new_allocator<const unsigned int>':
/usr/local/Cellar/gcc/4.9.2_1/include/c++/4.9.2/bits/allocator.h:92:11:   required from 'class std::allocator<const unsigned int>'
/usr/local/Cellar/gcc/4.9.2_1/include/c++/4.9.2/bits/stl_list.h:315:9:   required from 'class std::_List_base<const unsigned int, std::allocator<const unsigned int> >'
/usr/local/Cellar/gcc/4.9.2_1/include/c++/4.9.2/bits/stl_list.h:447:11:   required from 'class std::list<const unsigned int>'
main.cpp:3:41:   required from here
/usr/local/Cellar/gcc/4.9.2_1/include/c++/4.9.2/ext/new_allocator.h:93:7: error: 'const _Tp* __gnu_cxx::new_allocator<_Tp>::address(__gnu_cxx::new_allocator<_Tp>::const_reference) const [with _Tp = const unsigned int; __gnu_cxx::new_allocator<_Tp>::const_pointer = const unsigned int*; __gnu_cxx::new_allocator<_Tp>::const_reference = const unsigned int&]' cannot be overloaded
   address(const_reference __x) const _GLIBCXX_NOEXCEPT
   ^
/usr/local/Cellar/gcc/4.9.2_1/include/c++/4.9.2/ext/new_allocator.h:89:7: error: with '_Tp* __gnu_cxx::new_allocator<_Tp>::address(__gnu_cxx::new_allocator<_Tp>::reference) const [with _Tp = const unsigned int; __gnu_cxx::new_allocator<_Tp>::pointer = const unsigned int*; __gnu_cxx::new_allocator<_Tp>::reference = const unsigned int&]'
   address(reference __x) const _GLIBCXX_NOEXCEPT
   ^

如果我将容器类型从std::list更改为std::vectorstd::dequestd::forward_list,则会收到大致相同的错误消息。如果我将模板参数从const unsigned更改为unsigned,则编译正常。

这里发生了什么?我不明白为什么它不会编译。

1 个答案:

答案 0 :(得分:2)

Visual C ++ 2015提供了澄清诊断

  

C ++标准禁止使用const元素的容器,因为allocator<const T>格式不正确。

据我了解,这是因为分配器的allocate方法返回指向未初始化T项数组的指针,如果Tconst那么这些项目永远不会被初始化。

我找不到allocator<const T>格式错误的任何明确陈述,因此它可能是语义的结果。

正如DieterLücking所说in a commentconst类型T在提供reference和{{1}地址的两个成员函数之间存在直接冲突},因为当类型为const_reference时,它们是相等的。