将对象转换为引用?

发布于 2024-11-05 20:22:39 字数 206 浏览 1 评论 0原文

我最近一直在阅读一些 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

谁许谁一生繁华 2024-11-12 20:22:39

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 have Foo::operator=(const Foo &) called for assignment if Foo::operator=(Foo &) also exists.

慵挽 2024-11-12 20:22:39

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 to const Foo &. For the answer to the question after *y edit, please see the answer given by n0rd

一刻暧昧 2024-11-12 20:22:39

有趣的是,如果 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();
}

请参阅 Ideone 的输出。
有趣的是,如果您显式构造函数,它会显示@usta 解释的未定义行为。

Interestingly, the misread code could still be possible, if Foo has a non-explicit constructor that takes a Foo* pointer.

#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();
}

See the output at Ideone.
Interestingly, if you make the constructor explicit, it shows the undefined behaviour explained by @usta.

江城子 2024-11-12 20:22:39

您必须在 y 之后声明 x

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

或者:

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

You'll have to declare x after y:

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

Alternatively:

Foo x;
Foo* y = new Foo();
x = (Foo&)*y;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文