gpt4 book ai didi

C++ : struggle with generic const pointer

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:25:59 26 4
gpt4 key购买 nike

我在一些模板代码中遇到了一些烦人的常量正确性问题,最终归结为以下观察结果:出于某种原因,给定一个 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 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 中获得一个通用的、const 正确的指针类型呢? (如果不使用 boost::mpl::if_ 和 type_traits 来检查容器是否常量,我真的看不出如何做到这一点……但必须有一种不那么冗长的方法来做到这一点)

编辑:以防万一,我正在使用 gcc 4.3.2 进行编译。

最佳答案

它不起作用,因为您的 const 不适用于您认为它适用的对象。例如,如果您有

typedef int* IntPtr;

然后

const IntPtr p;

不代表

const int* p;

而是代表

int* const p;

Typedef-name 不是宏。一旦类型的“指针”被包装到 typedef 名称中,就无法再使用它来创建指向常量的指针类型。 IE。绝对没有办法使用上面的 IntPtr typedef-name 来产生等价的

const int* p;

您必须显式地使用指向类型(就像您对 value_type 所做的那样),或者检查您的容器是否定义了不同的 typedef-name,const 已经被包装“内部”(如 const_pointer 或类似的东西)。

关于C++ : struggle with generic const pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647327/

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