Ho un modello di classe A
che contiene un contenitore di puntatori (T*
):reinterpret_cast porta a comportamenti non definiti?
template <typename T>
class A {
public:
// ...
private:
std::vector<T*> data;
};
e un gruppo di funzioni come:
void f(const A<const T>&);
void g(const A<const T>&);
E 'OK per chiamare queste funzioni tramite un cast da A<const T>
a A<T>
?
A<double> a;
...
auto& ac = reinterpret_cast<const A<const double>&>(a);
f(ac);
Sono abbastanza sicuro che questo codice ha un comportamento non definito.
È pericoloso utilizzare tali conversioni nella vita reale?
Se è UB, è certamente pericoloso utilizzarli nella vita reale. Questo suona sospettosamente come un problema XY, però. – erip
Affidarsi a UB è sempre pericoloso, anche se * "funziona nel mondo reale" *. Basti pensare a progetti come Qt-5, Chromium, KDevelop che sono stati interrotti da gcc6 perché hanno usato alcune sciocchezze 'this == nullptr'. –
@Holt Potrebbe essere un'interfaccia immutabile. – erip