【发布时间】:2009-10-30 00:18:07
【问题描述】:
我在一些模板代码中遇到了一些令人讨厌的 const 正确性问题,最终归结为以下观察:由于某种原因,给定一个 STL-ish 容器类型 T,const typename T::pointer 实际上似乎并不产生一个常量指针类型,即使T::pointer 等价于T::value_type*。
下面的例子说明了这个问题。假设您有一个模板化函数,该函数接受一个必须满足 STL 随机访问容器概念要求的容器。
template <class Container>
void example(Container& c)
{
const typename Container::pointer p1 = &c[0]; // Error if c is const
const typename Container::value_type* p2 = &c[0];
}
那么,如果我们给这个函数传递一个 const 容器...
const std::vector<int> vec(10);
example(vec);
...我们从const int* 到int* 的转换无效。但是为什么在这个例子中const typename Container::pointer 和const int* 不一样呢?
请注意,如果我将 const typename Container::pointer 更改为简单的 typename Container::const_pointer 它编译得很好,但是,据我所知, const_pointer typedef 是一个扩展,(我没有看到它在 C++ 标准容器要求中提到(23.5,表 65)),因此我不想使用它。
那么我怎样才能从容器 T 中获得一个通用的、常量正确的指针类型呢? (如果不使用 boost::mpl::if_ 和 type_traits 来检查容器是否为常量,我真的看不到如何做到这一点......但必须有一种不那么冗长的方法来做到这一点)
编辑:以防万一,我使用 gcc 4.3.2 来编译它。
【问题讨论】:
标签: c++ templates stl constants