我有一个类模板A,其中包含一个指针容器(T*):

template <typename T>
class A {
public:
   // ...
private:
   std::vector<T*> data;
};

和一堆功能,例如:
void f(const A<const T>&);
void g(const A<const T>&);

是否可以通过从A<const T>A<T>的转换来调用这些函数?
A<double> a;
...
auto& ac = reinterpret_cast<const A<const double>&>(a);
f(ac);

我很确定此代码具有未定义的行为。

在现实生活中使用此类转换是否危险?

最佳答案

由于A<double>A<const double>是不相关的类型,因此实际上是未指定的(最初我认为是未定义的)行为,因此是的,在现实生活中使用它是一个坏主意:您永远不知道要移植到该更改的系统或编译器行为是奇怪的方式。

引用:

5.2.10/11:



因此,他们将我们重定向到了前面的5.2.10/7部分:



如果fg是适用于容器的算法,则简单的解决方案是将其更改为适用于范围(迭代器对)的模板算法。

07-24 19:10
查看更多