c++ - هل اسم فئة مؤهل بالكامل وصولاً إلى النطاق العالمي مطلوب من أي وقت مضى لتعريفات وظائف العضو خارج الخط؟




name-lookup global-scope (2)

This جعلني This السؤال أتساءل عما إذا كان من المفيد / الضروري على الإطلاق تأهل أسماء الفئات بالكامل (بما في ذلك مشغل النطاق العالمي) في تعريف وظيفة العضو خارج الصف.

من ناحية ، لم أر هذا من قبل (يبدو أن بناء الجملة للقيام بذلك بشكل صحيح غامض). من ناحية أخرى ، فإن البحث عن اسم C ++ غير تافه للغاية ، لذلك ربما توجد حالة ركنية.

سؤال:

هل هناك أي وقت مضى حيث يتم تقديم تعريف وظيفة عضو خارج الفئة بواسطة
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
سوف تختلف عن
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... } (لا يوجد نطاق عالمي :: بادئة)؟

لاحظ أنه يجب وضع تعريفات وظيفة العضو في مساحة اسم تحوي الفئة ، لذلك this ليس مثالًا صحيحًا.


إذا تم استخدام توجيه استخدام ، فيمكن أن يكون هناك رمز محير.

النظر في البرنامج التوضيحي التالي

#include <iostream>
#include <string>

namespace N1
{
    struct A
    {
        void f() const;
    };      
}

using namespace N1;

void A::f() const { std::cout << "N1::f()\n"; }

struct A
{
    void f() const;
};

void ::A::f() const { std::cout << "::f()\n"; }

int main() 
{
    N1::A().f();
    ::A().f();

    return 0;
}

لذلك لسهولة القراءة هذا الاسم المؤهل

void ::A::f() const { std::cout << "::f()\n"; }

يظهر بدقة حيث يتم الإعلان عن الوظيفة.


من الضروري أن يكون المرء مازوشيًا ويستمتع بكتابة مثل هذه الأشياء

namespace foo {
    namespace foo {
        struct bar {
            void baz();
        };
    }

   struct bar {
       void baz();
   };

   void foo::bar::baz() {
   }

   void (::foo::bar::baz)() {
   }
} 

يمكن للمرء بالطبع كتابة التحميل الزائد الثاني كـ foo::foo::bar::baz في النطاق العالمي ، لكن السؤال كان ما إذا كان للإعلانين معنى مختلف أم لا. لا أوصي بكتابة هذا الرمز.







scope-resolution-operator