考虑以下类型:
template<typename T> struct View
{
T* data;
size_t size;
};
View<T>&
从到转换是否有效View<const T>&
?
它会引发未定义的行为吗?
我怀疑该转换在所有编译器上都将按预期工作,但由于严格的别名规则,根据标准,其在技术上将是未定义的行为。
考虑以下类型:
template<typename T> struct View
{
T* data;
size_t size;
};
View<T>&
从到转换是否有效View<const T>&
?
它会引发未定义的行为吗?
我怀疑该转换在所有编译器上都将按预期工作,但由于严格的别名规则,根据标准,其在技术上将是未定义的行为。
View<T>
和View<const T>
是不相关的类型,因此将引用从第一个类型转换为第二个类型违反了严格的别名规则并导致UB(未定义行为)。确实,将 转换
T*
为是有效的const T*
(因为这些是相关类型),但是在将引用转换为包含此类成员的类时,这并不相关(View
)。它可能在您的编译器上按您的预期工作,但按照标准它仍然是未定义的行为,因此我不建议依赖它。
正如@FrançoisAndrieux上面的评论一样,您可以通过添加转换构造函数或转换运算符来处理它,以允许从 转换
View<T>
为View<const T>
。