Здесь мы все узнали в День 1 из С++, который мы считаем само собой разумеющимся, но явно не следует из формулировки Стандарта.
Учитывая класс S
, мы можем определить его конструктор
struct S { S(); };
S::S() { … }
Но стандарт, похоже, позволяет это также:
struct S { S(); };
S() { … }
Квалификация имени класса с самим собой всегда разрешена, но всегда избыточна. Например, S::S::S::S() { … }
также является допустимым объявлением. Если S::S
, то почему не просто S
?
Из С++ 11 §12.1/1,
Конструкторы не имеют имен. Для объявления или определения конструктора используется специальный синтаксис декларатора. Синтаксис использует:
- необязательный spec-specifier-seq, в котором каждый spec-спецификатор является либо спецификатором функции, либо constexpr,
- имя класса конструкторов и
- список параметров
в этом порядке.
В равной степени это относится к области класса или пространства имен. Существует специальное правило об области пространства имен, §9.3/5,
Если определение функции-члена лексически выходит за пределы определения его класса, имя функции-члена должно быть присвоено его именем класса с помощью оператора::.
Однако конструкторы не имеют имен, поэтому это не применяется, правильно? Более того, нет причин требовать квалификации, потому что нет синтаксической двусмысленности. Функция, объявленная без возвращаемого типа и имя класса для идентификатора, всегда является синтаксической ошибкой в соответствии с действующими правилами. Правильно?
Не нужно начинать писать код с опусканием квалификации, но есть ли причина, по которой компилятор не принимает этого, или это просто традиция?