Это полное имя в объявлении функции-члена?

этот код принимается MSVC9.0. Мой вопрос, Является ли это законным в соответствии со стандартом (старый и новый). Цитата тоже была бы очень кстати.

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

2 ответов


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

A Декларатор-id не будет квалифицировано за исключением

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

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

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

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

, потому что X::f не попадает ни в одну из этих четырех категорий, это неверный.

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

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


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

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

$8.3:

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

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