在&符号内铸造

时间:2009-12-23 12:15:18

标签: c++ visual-c++ variables reference casting

我遇到了这段代码

int n1 = 10;
int n2 = (int &)n1;

我不明白这个演员的意思,n2不是引用,因为修改n1不反映n1。奇怪的是,这段代码在gcc中抛出编译错误,在VC ++中编译很好。

有人知道这个演员的意思吗?

6 个答案:

答案 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类型的左值,则演员阵容是多余的,它绝对没有任何变化。如果n1const 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转换为引用。