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

时间:2015-12-25 10:28:09

标签: c++11 rvalue-reference static-cast

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

struct A {
  int x{0};
};

struct B : public A {
  int y{1};
};

int main() {
  A a;
  B b = static_cast<B &&>(a);
}

IMO,这段代码显然存在缺陷,我通过尝试访问b.y并在Valgrind下运行程序(报告内存错误)来确认它。 我不明白为什么这甚至编译(我使用的是g ++ 4.9.3)。我实际上期待no matching function for call to B::B(A &&)行的错误消息。如果这是一个愚蠢的评论我很抱歉,但它与编写B b = static_cast<B>(a)有什么不同 - 这确实给我一个编译错误?我看到的唯一区别是从A复制到B vs从A移到B,这两个都是未定义的。

1 个答案:

答案 0 :(得分:5)

static_castA的左值的B &&有效:

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

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

  

我实际上期待no matching function for call to B::B(A &&)行的错误消息。

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