Следующая простая программа не может быть скомпилирована с MSV C, но не с G CC и Clang? (т. е. MSV C вызывает static_assert
).
#include <utility>
class Element {
virtual ~Element() = default;
};
struct Proxy {
Element* e{};
};
int main() {
Proxy p;
static_assert(std::is_same<decltype(dynamic_cast<const Element*>(p.e)), const Element*>::value, "not const???" );
}
Я думаю, стандарт вполне понятен:
Результат выражения dynamic_cast (v) является результатом преобразования выражения v в тип T. T должен быть указателем или ссылкой на полный тип класса или «указателем на cv void». Оператор dynamic_cast не должен отбрасывать constness ([expr.const.cast]).
Есть ли какая-то другая часть в стандарте, которая поддерживает MSV C, здесь, или это ошибка компилятора? Или даже UB? Но если так, то почему?
Живой код здесь .