
区别
类型萃取器和cast类操作符都可以用于类型转换,但它们的用途和工作方式有所不同。
类型萃取器,如 std::remove_reference<T>、std::remove_const<T>、std::add_pointer<T> 等,主要用于在编译时修改类型,它们并不直接进行类型转换,而是生成一个新的类型。这些类型萃取器通常用于模板元编程和泛型编程中,用于处理类型的各种特性。例如,std::remove_reference<T>::type 会生成一个去除了引用修饰的 T 类型,但它并不会改变任何实际的值或对象。
cast类操作符,如 static_cast、dynamic_cast、const_cast、reinterpret_cast 等,主要用于在运行时进行类型转换。它们可以改变一个值或对象的类型,但不能改变类型的特性。例如,const_cast<T>(x) 可以去除 x 的 const 修饰,但不能改变 x 的基础类型。
总的来说,类型萃取器和cast类操作符都可以进行某种形式的类型转换,但它们的用途和工作方式有所不同。类型萃取器主要用于在编译时处理类型的特性,而cast类操作符主要用于在运行时改变值或对象的类型。
代码示例
当然,下面是一些代码示例来说明类型萃取器和cast类操作符的区别。
首先,我们来看一个类型萃取器的例子:
#include <type_traits>
int main() {
const int x = 10;
std::remove_const_t<decltype(x)> y = 20; // y 的类型为 int
y = 30; // 这是合法的,因为 y 不是 const
return 0;
}
在这个例子中,我们使用 std::remove_const_t 类型萃取器去除了 x 的 const 修饰,生成了一个新的 int 类型,并用这个类型声明了一个新的变量 y。注意,这里并没有改变 x 的值或类型,只是生成了一个新的类型。
然后,我们来看一个cast类操作符的例子:
int main() {
const int x = 10;
int* p = const_cast<int*>(&x); // p 指向一个非 const 的 int
*p = 20; // 这是未定义行为,因为 x 实际上是 const 的
return 0;
}
在这个例子中,我们使用 const_cast 操作符去除了 x 的 const 修饰,并尝试修改 x 的值。但这是未定义行为,因为 x 实际上是 const 的,我们不能通过去除 const 修饰来修改 x 的值。
总的来说,类型萃取器主要用于在编译时处理类型的特性,生成新的类型,而不会改变任何实际的值或对象。而cast类操作符主要用于在运行时改变值或对象的类型,但不能改变类型的特性。








![[Eigen中文文档] 稠密矩阵分解函数对比](https://img-blog.csdnimg.cn/281b570fcc6542c18cf73cf1ad3151fe.png#pic_center)










