Ответ 1
Да
Это указано в class.virtual, в последнем черновике (n4606) мы видим:
§10.3 7/ Возвращаемый тип функции переопределения должен быть либо идентичен возвращаемому типу переопределенной функции или ковариантно с классами функций. Если функция
D::f
переопределяет функциюB::f
, возвращаемые типы функций ковариантны, если они удовлетворяют следующим критериям:
- оба являются указателями на классы, оба являются значениями lvalue для классов или оба являются ссылками rvalue на классы 111
- класс возвращаемого типа
B::f
является тем же классом, что и класс возвращаемого типаD::f
, или является однозначным и доступным прямым или косвенным базовым классом класса в возвращаемом типеD::f
- оба указателя или ссылки имеют одинаковую cv-квалификацию, а тип класса в возвращаемом типе
D::f
имеет ту же самую cv-квалификацию, что или менее cv-qualification, чем тип класса в возвращаемом типеB::f
.
В частности, последняя точка относится именно к этому случаю: допустимо, чтобы переопределяющий тип потерял квалификаторы const
и/или volatile
(однако он не может их получить).
Примечание: как упоминалось в @george выше, пункт 8/используется для предотвращения этого от работы с неполными типами классов, но это было с фиксированной.