Требование компилятора для переопределения и финала - PullRequest
4 голосов
/ 24 сентября 2011

Я могу вспомнить, что во время обсуждения общих атрибутов, которые в конечном итоге приводят к новым контекстным ключевым словам override и final, было высказано предположение, что поддержка компилятором этих руд некоторых может быть необязательной (я полагаюв стандартном тексте это будет читаться как «поведение зависит от реализации). Но я не могу найти никаких следов об этой дополнительности в FDIS и исправлениях после нее.

Но так как не найти это не является доказательством, янужно спросить: Обязательна ли поддержка , как описано в 2.11p2, 9.2 и 10.3 FDIS для override и final для компилятора, соответствующего требованиям?

Требуется ли, например, чтобы соответствующий компилятор отклонял

class Foo {
    void func() override; // Error: not virtual, 9.2p9
};

Или он все еще соответствует, игнорируя override ?

Ответы [ 2 ]

6 голосов
/ 24 сентября 2011

Да, требуется, чтобы override не игнорировалась соответствующей реализацией.Во-первых, override может появиться только в объявлении виртуальной функции-члена.

9.2 / 9:

[...] Virt-specier-seq должен появляться тольков объявлении виртуальной функции-члена.

Во-вторых, виртуальная функция, которая не переопределяет функцию-член базового класса, но помечена override, делает программу плохо сформированной.

10.3 / 7:

Если виртуальная функция помечена переопределением virt-спецификатора и не переопределяет функцию-член базового класса, программа имеет некорректную форму.

Поскольку оба стандарта являются диагностируемыми правилами стандарта, соответствующий компилятор запрещает игнорировать нарушения.(1.4 / 1)

То же самое относится к final, и соответствующие требования приведены в 9 [class] / 3 и 10.3 [class.virtual] /4.

.
5 голосов
/ 24 сентября 2011

использование из override и final не является обязательным для программиста, но нигде не говорится, что компилятор может их игнорировать.

Это могло бы быть иначе дляболее ранние предложения, которые использовали атрибуты вместо ключевых слов.Атрибуты оставляют компилятору гораздо больше свободы.

...