我最近一直在阅读一些OSS代码并偶然发现了这个奇特的部分:
class Foo { ..... };
void bar() {
Foo x;
Foo *y=new Foo();
x=(const Foo &) *y;
}
对于我的生活,我找不到关于将对象转换为const引用的行为的文档。
答案 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;