当前位置:  开发笔记 > 编程语言 > 正文

C++ 11静态转换为右值引用

如何解决《C++11静态转换为右值引用》经验,为你挑选了1个好方法。

我的一个朋友在一个项目中写了一些类似的代码:

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)- 这确实给我一个编译错误?我看到的唯一区别是复制ABvs移动AB,这两个都是未定义的.



1> 小智..:

static_cast从类型的左值AB &&可以是有效的:

B b;
A &a = b;
B b2 = static_cast(a);

转换是可用的,不会被编译器拒绝,因为它可能在其他情况下有效.是的,你是对的,在你的情况下,它绝对无效.

我实际上期待一条错误信息no matching function for call to B::B(A &&).

如果使用的话,你会在这些行上得到错误(但不完全是这样)std::move(a).通过不必拼出该类型,可以减少出错的可能性.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有