[英]What's the difference between static_cast<type> and static_type<type *>?
到目前为止,我知道static_cast
是一个编译时操作,它以某种方式分析实体的 memory 并尝试将其转换为指定的 object。
我看到 static_cast 广泛用作static_cast<T *>
。 这是什么原因? 是不是因为编译器需要一个指针来检查 object 的 memory 布局?
例子:
union U { int a; double b; } u;
void* x = &u; // x's value is "pointer to u"
double* y = static_cast<double*>(x); // y's value is "pointer to u.b"
char* z = static_cast<char*>(x); // z's value is "pointer to u"
但是,对于static_cast<T>
这会失败:
double yy = static_cast<double>(u); error: cannot convert 'union U' to 'double' without a conversion operator
我首先在类的使用中发现了这种类型的转换,并且看起来它在那里使用得更多。
Derived * d = new Derived();
Base * b = static_cast<Base *>(d);
然而,同样的问题仍然存在:
Base b1 = Base();
Derived d2 = Derived();
b1 = static_cast<Base>(d2);
// No error here
我能否详细说明 static_cast 如何在幕后工作以及它与 memory (因此是对象)和(如果有必要)发生的指令有何关系?
考虑static_cast
的两种不同用例可能会有所帮助:一种用于将非指针类型相互转换,另一种用于将指针类型相互转换。
在将非指针类型相互转换时, static_cast
的含义是“进行从源值初始化目标类型的 object 时会进行的那种转换”。 因此,例如,在此代码中:
int aASCII = 64;
cout << static_cast<char>(aASCII) << endl; // Prints 'A'
static_cast<char>(aASCII)
的意思是“如果我要将新的char
值初始化为aASCII
,请给我我会得到的char
值。” 这类似于执行以下操作:
int aASCII = 64;
char temp = aASCII;
cout << temp << endl;
同样,考虑以下代码:
int total = 137;
int numItems = 42;
cout << static_cast<double>(total) / numItems << endl;
static_cast<double>(total)
位的意思是“在进行除法时假设total
是double
精度数”。 这类似于写作
int total = 137;
int numItems = 42;
double temp = total;
cout << temp / numItems << endl;
考虑到这一点,为什么这段代码不能编译?
double yy = static_cast<double>(u); // Oops!
原因是这有点像写作
double temp = u; // Oops, doesn't compile
double yy = temp;
在这里,这不会编译,因为您无法将double
初始化为union
类型U
的变量。
使用带有指针的static_cast
使用一组不同的规则。 使用指针时, static_cast
的意思是“请假装指针指向我希望它指向的类型的 object,但前提是存在一些可行的宇宙。” 因此,例如,这是完全合法的:
Base* ptr = new Derived;
Derived* dPtr = static_cast<Derived*>(ptr);
在这里,这表示“我有一个Base*
类型的指针。有一个合理的世界,它确实指向Derived
。请将指针转换为Derived*
,但不要进行任何运行时检查以确保这是安全。我知道,如果这实际上并不指向Derived
,那么会发生坏事。
但是,您不能这样写:
float* ptr = new float[137];
Derived* dPtr = static_cast<Derived*>(ptr); // Error!
这是行不通的,因为float*
类型的指针无法指向Derived
object(在某个时间点不对某个指针做一些非常可怕的事情)。
你的代码的原因
double* y = static_cast<double*>(x); // y's value is "pointer to u.b"
很好是因为x
是一个void*
,它可以指向任何(非功能)实体,所以它可以指向一个double
是合理的。
static_cast<type>
和static_type<type *>
有什么区别?
type
和type*
是不同的类型。 第一次转换转换为一种类型,第二次转换转换为另一种类型。
我看到 static_cast 广泛用作
static_cast<T *>
。 这是什么原因?
因为可能在这些情况下,意图是转换为T*
类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.