Ответ 1
Предложение о добавлении ключевых слов, контролирующих переопределение (override
/final
), N3151, дает нам некоторое представление об этом выборе (акцент мой):
Предпочтительно размещать такие ключевые элементы управления в конце объявление, чтобы они не столкнулись, например. типы возврата на начало деклараций.
[...]
Для контекстно-зависимых, нормальных ключевых слов это менее важно, когда ключевые слова размещаются, потому что слова зарезервированы. Мы могли бы поставить их в начале деклараций или в конце.
Во время обсуждения атрибутов Фрэнсис Стеклобор указал что начало деклараций становится переполненным. Если мы ключевые слова виртуального управления в начале, мы можем привести примеры как показано ниже:
struct B
{
virtual volatile const unsigned long int f()
volatile const noexcept;
void f(int g);
};
struct D : B
{
virtual hides_name virtual_override final_overrider volatile const unsigned long int f()
volatile const noexcept;
};
Включение новых ключевых слов в конце, по крайней мере, облегчает ситуацию несколько:
struct B
{
virtual volatile const unsigned long int f()
volatile const noexcept;
void f(int g);
};
struct D : B
{
virtual volatile const unsigned long int f()
hides_name virtual_override final_overrider volatile const noexcept;
};
Есть люди, которые считают, что эти контрольные ключевые слова должны быть в то же место с виртуальным. Как уже упоминалось, это место уже переполнено.
Примечание:
Стандарт С++ 11 определяет контекстно-зависимые ключевые слова в разделе § 2.11/2 [lex.name]:
Идентификаторы в таблице 3 имеют особое значение при появлении в определенный контекст. Когда упоминается в грамматике, эти идентификаторы используются явно, а не используют грамматику идентификатора производство. Если не указано иное, любая двусмысленность относительно того, данный идентификатор имеет особое значение для интерпретации токен как обычный идентификатор.
Таблица3:
окончательное переопределение