关于c++中的static_cast
static cast - About static_cast in c++
我正在阅读http://www.gotw.ca/gotw/036.htm(它是关于直接初始化和复制初始化),它有一个类似的提及:
static_cast<S>(t); // performing a static_cast
static_cast使用直接初始化。
谁能解释为什么static_cast
需要使用初始化?我认为cast只是重新解释给定内存位置中的位…
reinterpret_cast重新解释位。static_cast是一种感知语义的转换。它将尝试找到一个合理的操作,将值从一种类型转换为另一种类型,如果不能,则编译失败。
合理的操作是各种整数和浮点类型之间的转换(可能带有截断),自动转换为bool,将bool转换为数字等。此外,还使用用户定义的转换操作符和单参数构造函数从用户定义类型转换到用户定义类型。在使用构造函数的情况下,它使用直接初始化,因此可以使用显式构造函数,而不像隐式转换那样不能。
static_cast在类层次结构中执行查找,以便转换到正确的类,它不会重新解释位(即reinterpret_cast)。
dynamic_cast也是如此,区别在于static_cast是在编译时进行的,而dynamic_cast是在运行时进行的。
看下面的例子:A: B, A: C, D: B,C
下面的代码将输出指针指向不同的内存块
{
D *ptrToD = new D();
C *ptr1 = static_cast<C>(ptrToD);
C *ptr2 = reinterpret_cast<C>(ptrToD);
if (ptr1==ptr2)
{
printf("Pointers point to the same memory block");
} else
{
printf("Pointers point to different memory blocks");
}
}
如果你看一下内存,它看起来像ABACD
如果你想将它强制转换为C, C从D开始的地方开始+sizeof(B) (AC),而A和B从与D相同的内存块开始
也许这不是一个完全解释性的例子,但是看下面的
void f(double **arg) {} // just to make a point
int main() {
double d(1.);
double *pd = &d;
double const *cpd = &d;
f(&pd); // OK
f(&(const_cast<double*>(cpd))); // Error
}
发出的错误是
error C2102: &需要l值
static_cast的行为与此相同,因为它们返回一个必须绑定到变量的r值。它就是被初始化的变量
我认为类型转换只是重新解释给定内存位置中的位…
不,强制类型转换执行类型转换。在这种情况下,它将t
转换为S
类型;这种转换是可能的,因为T
继承自S
,所以可以通过复制t
的这一部分来生成新的S
。像这样复制基本子对象有时被称为切片。
谁能解释为什么
static_cast
需要使用初始化?
类型转换需要创建新类型的(临时)对象;该对象需要初始化,static_cast
的规则指定它使用直接初始化。由于S
是一个类类型,这意味着它是通过调用合适的构造函数来初始化的——在本例中,是隐式声明的复制构造函数,它通过复制t
的S
子对象来初始化对象。
- 如何理解C++标准N3337中的expr.const.cast子句8
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- C++Cast运算符过载
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- static是如何使用ClassA::m_variable处理所有类对象的
- 在[expr.static.cast]/4中,术语"一个可行函数"指的是什么