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

C++11 static cast to rvalue reference

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

struct A {
  int x{0};
};

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

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

IMO,这段代码显然有缺陷,我通过尝试访问 Valgrind 下的 b.y 和 运行 程序(报告了内存错误)来证实了这一点。 我不明白的是为什么这甚至在编译(我正在使用 g++4.9.3)。我实际上是在期待一条类似于 no matching function for call to B::B(A &&) 的错误消息。如果这是一个愚蠢的话,我深表歉意,但它与写 B b = static_cast<B>(a) 有什么本质上的不同——后者确实会给我一个编译错误?我看到的唯一区别是从 A 复制到 B 与从 A 移动到 B,它们在这里都未定义。

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

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

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

I was actually expecting an error message along the lines of no matching function for call to B::B(A &&).

如果您使用 std::move(a),您会在这些行中遇到错误(但不完全是那样)。由于不必拼写类型,因此减少了出错的可能性。