class A{
public:
virtual ~A() {};
};
class B : public A{ };
int main(){
A&& p = B();
dynamic_cast<B&&>(std::move(p));
}
Выдает ошибку (G ++ 5.2.0):dynamic_cast и эталонный Rvalue
error: conversion to non-const reference type 'std::remove_reference<A&>::type& {aka class A&}' from rvalue of type 'A' [-fpermissive]
Он пытается бросить std::move(p)
к типу A&
, но не могу понять, почему. Я бы подумал, что нужно сделать p
как rvalue перед преобразованием в ссылку rvalue, но если я удалю std::move
, он компилируется отлично. От cppreference:
dynamic_cast <new_type> (expression)
Подобно других выражений литых, результат:
именующего если new_type является именующим ссылочным типом (выражение должно быть именующим)
xvalue если new_type является ссылочным типом rvalue (выражение может быть lvalue или rvalue)
Даже 5.2.7 N3337:
dynamic_cast<T>(v)
Если T является типом указателя, v должен быть prvalue указателя завершить тип класса, и результатом является prvalue типа Т Если T - ссылочный тип lvalue, v должен быть lvalue полного типа класса, а результат является lзначением типа, указанного T. Если T является ссылочным типом rvalue, v должно быть выражением, имеющим полный тип класса, и результатом является значение x для типа, указанного T.
Единственное требование, заключающееся в том, что я использую полный тип класса, который std::move(p)
, не так ли?
У Clang нет проблем с кодом – Cubbi
Подтверждено gcc 5.3. Однако работает без вызова 'std :: move'. ;) – erip
... как вы отметили в своем вопросе.Я должен читать вопросы более подробно. – erip