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
,它们在这里都未定义。
从 A
到 B &&
类型的左值的 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)
,您会在这些行中遇到错误(但不完全是那样)。由于不必拼写类型,因此减少了出错的可能性。
我的一个朋友在项目中写了一些类似的代码:
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
,它们在这里都未定义。
从 A
到 B &&
类型的左值的 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)
,您会在这些行中遇到错误(但不完全是那样)。由于不必拼写类型,因此减少了出错的可能性。