Для обращения к любому выражению по его имени в C++ имеется механизм
поиска имен. Это довольно сложный и многоэтапный механизм, в результате которого исходя из контекста обращения и самого имени транслятор силится понять что же там такое прекрасное имел в виду писатель кода.
Насколько видно, базово механизм делится на две ветви: поиск квалифицированных имен и поиск неквалифицированных имен.
И именно в этот момент речь заходит о т.н.
квалификации имени выражения.
Квалификация имени выражения тем полнее, чем точнее от самого корневого пространства имен (т.е. от
::
), через все пространства имен и пространства составных типов, написано имя выражения.
Имя
Process::WaitForExit
, хоть и является уже квалифицированным за счет указания пространства типа, в котором метод объявлен, все еще остается недостаточно квалифицированным чтобы считаться полностью квалифицированным.
Вызов метода по его полной квалификации выглядел бы так:
process.::base::Process::WaitForExit(&exit_code);
Для чего это нужно. Как уже было сказано выше,
UNL силится понять что там задумал писатель исходя из контекста кода и используемого имени. И иногда UNL в этом деле не преуспевает.
Например если шаблон типа наследуется от шаблона другого типа и пытается в своем интерфейсе использовать поля или методы своего родителя. Иначе транслятор просто не найдет в шаблоне родителя того, к чему там не было прямых обращений.
Или, например, более полная квалификация требуется для невиртуального вызова виртуального метода.
Полная квалификация всегда требуется для обращения к выражению внутри пространства имен из кода в другом пространстве имен.
Еще полная квалификация всегда требуется для обращения к статическим выражениям структур и классов снаружи этих структур и классов.
Для чего нужно было писать полную квалификацию конкретно в приведенном коде?
А кто его знает. Метод
base::Process::WaitForExit
[
?] не является виртуальным чтобы сделать предположение о невиртуальном вызове.
Просто автору так захотелось, наверное.