Почему "переопределение" заканчивается на С++ 11?

Я пытаюсь понять, почему в С++ 11 они должны были добавить ключевое слово override в конце метода вместо начала, например virtual. Я не вижу заинтересованности в том, чтобы писать как virtual, так и override в объявлении метода.

Есть ли техническая причина, по которой комитет не решил просто написать override вместо virtual, когда это было необходимо?

Спасибо!

Ответ 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:

окончательное переопределение

Ответ 2

Конечно, это техническая причина! Вы можете прочитать все об этом в этой статье.

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