【发布时间】:2016-09-04 05:53:00
【问题描述】:
我有一个类模板 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);
我很确定这段代码有未定义的行为。
在现实生活中使用此类转换是否危险?
【问题讨论】:
-
如果是UB,在现实生活中使用它们肯定是危险的。不过,这听起来有点像 XY 问题。
-
依赖 UB 总是很危险的,即使 “它在现实世界中有效”。想想 Qt-5、Chromium、KDevelop 等项目,它们被 gcc6 破坏了,因为它们使用了一些
this == nullptr废话。 -
@Holt 可能是一个不可更改的界面。
-
您应该阅读标准中的
5.2.10 Reinterpret cast部分:open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4582.pdf -
@erip 我已经更新了这个问题。您有解决问题的建议吗?
标签: c++ templates reinterpret-cast