Что такое полное имя?

Насколько я могу судить, термин "полностью квалифицированный" не упоминается в стандарте (например), но я могу вспомнить "слышать" его много раз в Интернете.

Что люди имеют в виду, когда говорят, что имя полностью квалифицировано?

Это считается?

A::f()

или только это?

::A::f()

И, если это стандарт, какую формулировку я не нашел?

Ответы

Ответ 1

Идентификатор, который использует оператор разрешения контекста, является квалифицированным именем согласно [expr.prim.id.qual]. В противном случае это неквалифицировано.

Стандарт не определяет значение "полностью квалифицированный", но упоминает его в [библиотека]/[требования]/[организация]/[содержание], где говорится (цитата из стандартного проекта)

Всякий раз, когда упоминается имя x, определенное в стандартной библиотеке, предполагается, что имя x полностью определено как :: std :: x, если явно не указано иное. Например, если элемент Effects: для библиотечной функции F описывается как вызывающий библиотечную функцию G, подразумевается функция :: std :: G.

Википедия определяет полностью определенное имя:

В компьютерном программировании полностью определенное имя - это однозначное имя, которое указывает, на какой объект, функцию или переменную ссылается вызов, независимо от контекста вызова.

Только имя, определенное, начиная с глобального пространства имен, однозначно без контекста. Это общее использование.

Ответ 2

Действительно, это не стандартный термин. У него нет определения в стандарте.

Тем не менее, фраза "полностью квалифицированный" встречается ровно один раз в пункте 3 [содержимого] (15.5.1.1 "Содержимое библиотеки" в наиболее актуальном проекте N4800 на момент написания статьи):

Всякий раз, когда упоминается имя x определенное в стандартной библиотеке, предполагается, что имя x полностью определено как ::std::x, если явно не указано иное.

Таким образом, в этом определении только имена, начинающиеся с ::, полностью определены.