Этот вопрос заставил меня задуматься о том, когда-либо полезно / необходимо полностью квалифицировать имена классов (включая оператор глобальной области видимости) в определении функции-члена вне класса.
С одной стороны, я никогда не видел, чтобы это было сделано раньше (и синтаксис для правильной работы кажется неясным). С другой стороны, поиск имени в C ++ очень нетривиален, поэтому, возможно, существует угловой случай.
Вопрос:
Был ли когда-нибудь случай, когда введение определения функции-члена вне класса
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
отличалось бы от
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }
(без ::
префикса глобальной области видимости )?
Обратите внимание, что определения функций-членов должны быть помещены в пространство имен, включающее класс, так что это недопустимый пример.
Ответы:
С помощью директивы может привести
Fully
к неоднозначным без квалификации.источник
Это необходимо, если кто-то мазохист и любит писать такие вещи, как это
Конечно, можно написать вторую перегрузку, как
foo::foo::bar::baz
в глобальной области видимости, но вопрос заключался в том, могут ли два объявления иметь разное значение. Я бы не рекомендовал писать такой код.источник
using
. Приятно выделять разные случаи!Если используется директива using, то здесь может быть запутанный код.
Рассмотрим следующую демонстрационную программу
Так что для удобства чтения это квалифицированное имя
показывает точно, где функция объявлена.
источник