Почему избыточная квалификация, поддерживаемая компилятором, является законной?
Я тестировал два компилятора и был удивлен, увидев, что обе версии поддерживают следующее определение:
class A {
A();
};
A::A::A() {}
^^^
Обратите внимание, что это также удается для методов, хотя оно помечено, когда объявление переопределено.
Вопросы:
- Является ли это действительной программой на С++?
- Если да, то какая цель это служит - или это просто побочный продукт?
Обновленная информация:
Если исходный вопрос был неясным или слишком коротким: мне любопытно, почему избыточные квалификации разрешены в определении (выделение также добавлено выше).
Clang Apple GCC 4.2 + LLVM были компиляторами
Ответы
Ответ 1
Да, это разрешено (§9/2):
Имя класса также вставляется в область самого класса; это известно как имя введенного класса. Для проверки доступа имя введенного класса рассматривается как имя публичного участника.
Для получения информации о причинах, которые приводят к инъекции класса, вы можете прочитать N0444.