将对象转换为引用?

时间:2011-05-07 20:06:46

标签: c++ casting reference

我最近一直在阅读一些OSS代码并偶然发现了这个奇特的部分:

class Foo { ..... };
void bar() {
    Foo x;
   Foo *y=new Foo();
   x=(const Foo &) *y;
}

对于我的生活,我找不到关于将对象转换为const引用的行为的文档。

4 个答案:

答案 0 :(得分:8)

x=(const Foo &) *y;作业。我看到显式转换为const引用的唯一原因是,如果Foo::operator=(const Foo &)也存在,则Foo::operator=(Foo &)要求分配。

答案 1 :(得分:6)

x=(const Foo &) y;行调用未定义的行为 更喜欢避免使用C风格的演员表;他们很容易出错。你让编译器保持沉默,所以它们太危险了。

修改:此答案当时是相关的,当问题y在演员投降到const Foo &之前未被解除引用时。有关*y编辑后问题的答案,请参阅n0rd

给出的答案

答案 2 :(得分:3)

有趣的是,如果Foo有一个带有Foo*指针的非显式构造函数,那么仍然可能存在误读代码。

#include <iostream>

class Foo{
public:
  Foo() {}
  Foo(Foo*) { std::cout << "Aha!\n"; }
};

int main(){
  Foo* pf = new Foo;
  Foo f = (const Foo&)pf;

  std::cin.get();
}

查看输出at Ideone 有趣的是,如果你使构造函数显式化,它会显示由@usta解释的未定义行为。

答案 3 :(得分:0)

您必须在x之后声明y

Foo* y = new Foo();
Foo& x = *y;

可替换地:

Foo x;
Foo* y = new Foo();
x = (Foo&)*y;