Siv*_*ran 5 c++ variables casting reference visual-c++
我遇到过这段代码
int n1 = 10;
int n2 = (int &)n1;
Run Code Online (Sandbox Code Playgroud)
我不明白这个转换的含义,n2不是引用,因为修改n1不反映n1.奇怪的是,这段代码在gcc中抛出编译器错误,因为在VC++中编译很好.
有人知道这个演员的意思吗?
小智 11
这是完全有效的C++代码,并使用g ++ 4.4.1进行编译.它创建对n1的临时引用,然后使用该引用引用的值初始化n2.
如果将expexsed作为函数,则可能更容易看到:
void f( int & n1 ) {
int n2 = n1; // initialise with valuue referred to by n1
}
Run Code Online (Sandbox Code Playgroud)
请注意,这不是有效的C代码,因为C不支持引用.
假设n2
有一些内置类型,强制转换int &
类型执行左值(无论它具有什么类型)的重新解释n1
作为类型的左值int
.
在int n2 = (int &) n1
声明的上下文中,如果n1
它本身是一个左值类型int
,则演员是多余的,它绝对没有变化.如果n1
是类型的左值const int
,那么转换只是抛弃了constness,这在上面的上下文中也是多余的.如果n1
是某个其他类型的左值,则强制转换只是重新解释n1
作为类型对象占用的内存int
(这称为类型双关).如果n1
不是左值,则代码格式不正确.
因此,在类似int n2 = (int&) n1
投影时,像强制转换的代码int &
只是非冗余的(有一些实际效果),即何时n1
是其他类型(不是int
)的左值.例如
float n1 = 5.0;
int n2 = (int &) n1;
Run Code Online (Sandbox Code Playgroud)
这相当于
int n2 = *(int *) &n1;
Run Code Online (Sandbox Code Playgroud)
并
int n2 = *reinterpret_cast<int *>(&n1);
Run Code Online (Sandbox Code Playgroud)
不用说,这是一个非常糟糕的编程习惯.
这是BTW,强烈倾向于使用专用C++风格的强制转换的情况之一.如果代码的作者使用reinterpret_cast
而不是C风格的演员,你可能不必问这个问题.
当然,如果n1
它本身是类型的int
,那么这个演员阵容没有任何有意义的解释.在那种情况下,它再次完全是多余的.
PS还有一种可能n2
是一个带有重载转换运算符的int &
类,这完全是一个不同的故事......无论如何,你必须告诉你什么n2
时候提出这样的问题.