问题描述
当我执行以下操作时会发生什么:
struct A {
int i;
string j;
A(){}
};
void f(A& a){
cout<< a.i<<结束;
}
int _tmain(int argc,_TCHAR * argv [])
{
A a;
ai = 6;
A * pa =& a;
f((A&)pa); //关键点
f(* pa); //按预期工作
返回0;
}
为什么这是合法的呢?
最近我发现有些人认为(A&)pa相当于* pa,而
不是根据上面的例子。 (f((A&)pa)的输出看起来像
一些整数,但如果它意味着f(* pa),肯定不是6。)
What happens exactly when I do the following:
struct A {
int i;
string j;
A() {}
};
void f(A& a) {
cout << a.i << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.i = 6;
A* pa = &a;
f((A&)pa); // CRITICAL POINT
f(*pa); // works as expected
return 0;
}
How come that this is legal, anyway?
Lately I''ve seen some people expect that (A&)pa be equivalent to *pa, which
is not according to the example above. (The output for f((A&)pa) looks like
some integer, but surely not 6 as should be if it meant f(*pa).)
推荐答案
整数相等实际发生的事情是你告诉编译器看这里,pa是
而不是指针''到达地址。 'A型结构'。这实际上是错误的,但是因为
你告诉编译器你知道的更好,所以你就是这样做的。并且
你很幸运,因为pa的大小恰好与A实例的大小相同。碰巧的是,当你进行
演员时,p的值重叠了A :: i。
因此,你只会在这个简单的例子中得到伪造的结果,实际上你会通常会获得访问冲突或其他一些hardtofind错误。
换句话说,当你使用类型转换时,你告诉了编译器
你知道你在做什么。如果你不知道你在做什么,告诉
编译器是一件非常愚蠢的事情......
(是的,引用已经实现和指针一样。但它们有不同的语义。)
-
Sigurd
我认为第一个语句(关于大小)是并不是真的相关,重要的是,
的重要性在于A实例的大小至少与
pa的大小一样大,所以没有堆外存储器是读取可能导致访问冲突的内容。我好吗?b $ b我是对吗?
然而,我已经尝试了A只有一个char成员而没有别的,
但是在这种情况下也没有发生访问冲突。 (我在调试和发布模式下编译了
示例。)
我认为它应该产生一些运行时错误,特别是在调试中
模式,不应该吗?
I think the first statement (about the sizes) is not really relevant, what
matters is that the size of an A instance is at least as big as the size of
pa, so no out-of-heap memory is read which could cause access violation. Am
I right?
However, I''ve tried it with A having only a char member and nothing else,
but no access violation occured in this case, either. (I compiled the
example both in debug and release mode.)
I think it should have produced some runtime error, especially in debug
mode, shouldn''t it?
如果你使用C ++样式演员表示法。
唯一有效的代码是:f(reinterpret_cast< A&>(pa)); // A *& - > A&。
当您在代码中看到* _cast运算符时,这通常意味着程序可以更好地编写
。但是当你看到reinterpret_cast时,这通常意味着什么是错误的,除非是低级代码。
-
弗拉基米尔Nesterovsky
电子邮件:
home:
这篇关于A *到A& ?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!