Considere o seguinte tipo:
template<typename T> struct View
{
T* data;
size_t size;
};
É válido transmitir de: View<T>&
To View<const T>&
?
Invoca comportamento indefinido?
Suspeito que o elenco funcionará conforme planejado em todos os compiladores, mas terá um comportamento tecnicamente indefinido de acordo com o padrão devido à regra estrita de alias .
View<T>
eView<const T>
são tipos não relacionados e, portanto, lançar uma referência do primeiro para o segundo viola as regras estritas de alias e causa UB (comportamento indefinido).É verdade que é válido lançar um
T*
toconst T*
(porque esses são tipos relacionados), mas isso não é relevante ao lançar uma referência a uma classe que contém tais membros (View
).Pode funcionar como você espera no seu compilador, mas ainda é um comportamento indefinido pelo padrão e, portanto, não aconselho confiar nele.
Como @FrançoisAndrieux comentou acima , você pode lidar com isso adicionando um construtor ou operador de conversão para permitir a conversão de
View<T>
paraView<const T>
.