Разрешено ли полное имя в объявлении функции-члена? - PullRequest
6 голосов
/ 18 августа 2011

Этот код принят MSVC9.0. У меня вопрос, законно ли это по стандарту (старому и / или новому). Цитата тоже будет очень кстати.

class X
{
   void X::f();
};

Ответы [ 2 ]

11 голосов
/ 18 августа 2011

Нет, это недействительно. Здесь X::f - квалифицированное имя; Вы пытаетесь использовать его как идентификатор-объявления . C ++ 03 8.3 [dcl.meaning] / 1 перечисляет обстоятельства, при которых идентификатор объявления может быть квалифицирован:

A идентификатор объявления не должен квалифицироваться, кроме

  • определение функции-члена или статического члена данных вне своего класса,

  • определение или явное создание экземпляра функции или переменной-члена пространства имен вне его пространства имен, или

  • определение ранее объявленной явной специализации вне ее пространства имен или

  • объявление функции-друга, которая является членом другого класса или пространства имен.

Поскольку X::f не относится ни к одной из этих четырех категорий, это неверно.

Правило, которое требует определения функции-члена вне определения класса, может быть найдено в C ++ 03 9.3 [class.mfct] / 5:

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

7 голосов
/ 18 августа 2011

Насколько я понимаю, это Недействительно согласно спецификации C ++ 03.

Ссылка - стандарт C ++ 03:

Раздел $ 8.3:

Каждый декларатор содержит ровно один идентификатор декларатора;он называет идентификатор, который объявлен.Идентификатор id объявления-идентификатора должен быть простым идентификатором, за исключением объявления некоторых специальных функций (12.3, 12.4, 13.5) и объявления специализаций шаблона или частичных специализаций (14.7). Идентификатор объявления не должен быть квалифицирован за исключением определения функции-члена (9.3) или статического члена данных (9.4) или вложенного класса (9.7) вне его класса, определения или явного создания экземплярафункция, переменная или член класса пространства имен вне его пространства имен, или определение ранее объявленной явной специализации вне его пространства имен, или объявление функции-друга, которая является членом другого класса или пространства имен (11.4).

Я надеюсь, что у меня есть соответствующее значение вышесказанного.Я признаю, что чтение и понимание цитат из Стандарта вызывает у меня головокружение.Дайте мне знать, если я неверно истолковываю это.

...