将对象转换为引用?
我最近一直在阅读一些 OSS 代码,并偶然发现了这篇奇特的文章:
class Foo { ..... };
void bar() {
Foo x;
Foo *y=new Foo();
x=(const Foo &) *y;
}
在我的一生中,我找不到有关将对象强制转换为 const 引用的行为的文档。
I've been reading some OSS code lately and stumbled upon this peculiar piece:
class Foo { ..... };
void bar() {
Foo x;
Foo *y=new Foo();
x=(const Foo &) *y;
}
For the life of me I can't find documentation about the behavior of casting an object to a const reference.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
x=(const Foo &) *y;
是赋值。我认为显式转换为 const 引用的唯一原因是如果Foo::operator=(Foo &)< 则调用
Foo::operator=(const Foo &)
进行赋值/code> 也存在。x=(const Foo &) *y;
is assignment. The only reason I see to explicitly cast to const reference is to haveFoo::operator=(const Foo &)
called for assignment ifFoo::operator=(Foo &)
also exists.x=(const Foo &) y;
行调用未定义的行为。更愿意避免 C 风格的强制转换;他们很容易出错。你让编译器静音,所以它们太危险了。
编辑:这个答案当时是相关的,在问题中,在转换为 const Foo & 之前没有取消引用 y 。
*y
编辑后问题的答案请参见n0rd给出的答案x=(const Foo &) y;
line invokes undefined behavior.Prefer to avoid C-style casts; they are easy to get wrong. You silence the compiler, so they are too dangerous.
Edit: this answer was relevant at the time, when in the question
y
was not dereferenced prior to the cast toconst Foo &
. For the answer to the question after*y
edit, please see the answer given by n0rd有趣的是,如果
Foo
有一个接受Foo*
指针的非显式构造函数,误读代码仍然是可能的。请参阅 Ideone 的输出。
有趣的是,如果您显式构造函数,它会显示@usta 解释的未定义行为。
Interestingly, the misread code could still be possible, if
Foo
has a non-explicit constructor that takes aFoo*
pointer.See the output at Ideone.
Interestingly, if you make the constructor explicit, it shows the undefined behaviour explained by @usta.
您必须在
y
之后声明x
:或者:
You'll have to declare
x
aftery
:Alternatively: