我有一个类模板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部分:
如果f
和g
是适用于容器的算法,则简单的解决方案是将其更改为适用于范围(迭代器对)的模板算法。