Подтвердить что ты не робот

Почему избыточная квалификация, поддерживаемая компилятором, является законной?

Я тестировал два компилятора и был удивлен, увидев, что обе версии поддерживают следующее определение:

class A {
  A();
};

A::A::A() {}
   ^^^

Обратите внимание, что это также удается для методов, хотя оно помечено, когда объявление переопределено.

Вопросы:

  • Является ли это действительной программой на С++?
  • Если да, то какая цель это служит - или это просто побочный продукт?

Обновленная информация:

Если исходный вопрос был неясным или слишком коротким: мне любопытно, почему избыточные квалификации разрешены в определении (выделение также добавлено выше).


Clang Apple GCC 4.2 + LLVM были компиляторами

4b9b3361

Ответ 1

Да, это разрешено (§9/2):

Имя класса также вставляется в область самого класса; это известно как имя введенного класса. Для проверки доступа имя введенного класса рассматривается как имя публичного участника.

Для получения информации о причинах, которые приводят к инъекции класса, вы можете прочитать N0444.