Что такое константа динамического c приведения члена класса указательного типа - PullRequest
3 голосов
/ 12 января 2020

Следующая простая программа не может быть скомпилирована с 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? Но если так, то почему?

Живой код здесь .

1 Ответ

1 голос
/ 12 января 2020

Похоже, ошибка компилятора. [expr.dynami c .cast] / 3 подразумевает, что результатом должен быть указатель на тип класса с константной квалификацией.

Если тип v такой же как T, или он такой же, как и T, за исключением того, что тип объекта класса в T более квалифицирован cv, чем тип объекта класса в v, в результате получается v (, если необходимо ).

Я подчеркнул «преобразован при необходимости», потому что это относится к квалификации const типа класса, я считаю.

...