我的一个朋友在一个项目中写了一些类似的代码:
struct A { int x{0}; }; struct B : public A { int y{1}; }; int main() { A a; B b = static_cast(a); }
IMO,这段代码显然存在缺陷,我通过尝试b.y
在Valgrind(报告内存错误)下访问和运行程序来确认它.我不明白为什么这甚至编译(我使用的是g ++ 4.9.3).我实际上期待一条错误信息no matching function for call to B::B(A &&)
.如果这是一个愚蠢的评论,我道歉,但它与写作有什么不同B b = static_cast(a)
- 这确实给我一个编译错误?我看到的唯一区别是复制A
到B
vs移动A
到B
,这两个都是未定义的.
甲static_cast
从类型的左值A
到B &&
可以是有效的:
B b; A &a = b; B b2 = static_cast(a);
转换是可用的,不会被编译器拒绝,因为它可能在其他情况下有效.是的,你是对的,在你的情况下,它绝对无效.
我实际上期待一条错误信息
no matching function for call to B::B(A &&)
.
如果使用的话,你会在这些行上得到错误(但不完全是这样)std::move(a)
.通过不必拼出该类型,可以减少出错的可能性.