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