我遇到了这段代码
int n1 = 10;
int n2 = (int &)n1;
我不明白这个演员的意思,n2不是引用,因为修改n1不反映n1。奇怪的是,这段代码在gcc中抛出编译错误,在VC ++中编译很好。
有人知道这个演员的意思吗?
答案 0 :(得分:11)
这是完全有效的C ++代码,并且使用g ++ 4.4.1进行编译。它创建对n1的临时引用,然后使用该引用引用的值初始化n2。
如果将其作为一个函数进行表达,这可能更容易看出:
void f( int & n1 ) {
int n2 = n1; // initialise with valuue referred to by n1
}
请注意,这不是有效的C代码,因为C不支持引用。
答案 1 :(得分:9)
假设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;
这相当于
int n2 = *(int *) &n1;
和
int n2 = *reinterpret_cast<int *>(&n1);
毋庸置疑,这是一个非常糟糕的编程习惯。
这是BTW,强烈倾向于使用专用C ++风格的强制转换的情况之一。如果代码的作者使用reinterpret_cast
而不是C风格的演员,你可能不必问这个问题。
当然,如果n1
本身属于int
类型,则此演员表没有任何有意义的解释。在那种情况下,它再次完全是多余的。
P.S。还有一种情况是n2
是一个将转化运算符重载为int &
类型的类,这完全是一个不同的故事...无论如何,当你问的时候,你必须告诉n2
是什么这样的问题。
答案 2 :(得分:2)
int main()
{
int n1 = 10;
int n2 = (int &)n1;
cout<<n2<<endl;
}
按预期打印10张
演员没有问题。
它只是创建一个临时引用,如下一个输出所示:
int main()
{
int n1 = 10;
int n2 = (int &)n1;
n2 = 20;
cout<<n1<<endl; // print 10 and not 20.
}
答案 3 :(得分:1)
我相信它可能是原始代码中的拼写错误。
GCC通常比VC ++更迂腐。但是这个代码看起来很好,即使它做了不必要的事情。基本上为n1创建临时引用,然后使用复制构造函数实例化n2。
答案 4 :(得分:1)
这是显而易见的事情。将n1
强制转换为int引用,然后将其分配给int n2
。
假设n1
是一个int,它应该编译得很好。
如果n1
是右值,则无法编译。以下内容无法编译,例如:
(int&)foo();
(int&)42;
(int&) (x+y); // assuming x and y are int variables
答案 5 :(得分:0)
它也在gcc中编译(我只是为了确定)。它只是将n1转换为引用。