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