سؤال

$ 10.2/4- [ملاحظة: يبحث عن اسم في محدد من النوع المفصل (3.4.4) أو محدد الأساس (الفقرة 10) ، على سبيل المثال ، يتجاهل جميع الإعلانات غير النمطية ، مع البحث عن اسم في متداخل- يتجاهل المحددات الاسم (3.4.3) إعلانات الوظيفة والمتغير والتعداد. "

لقد وجدت أن هذا البيان مربك للغاية في هذا القسم أثناء وصفه حول البحث عن الاسم.

void S(){}

struct S{
   S(){cout << 1;}
   void f(){}
   static const int x = 0;
}; 

int main(){ 
   struct S *p = new struct ::S;  // here ::S refers to type
   p->::S::f();

   S::x;  // base specifier, ignores the function declaration 'S'

   ::S(); // nested name specifier, ignores the struct declaration 'S'.
   delete p;
} 

أسئلتي:

  1. هل فهمي للقواعد صحيح؟

  2. لماذا ::S على الخط القيام بمعالجة جديدة تلقائيًا ليعني بنية S, ، بينما في السطر الأخير ::S يعني الوظائف S في مساحة الاسم العالمية.

  3. هل هذه النقطة إلى الغموض في الوثائق ، أم أنه يوم آخر بالنسبة لي للابتعاد عن المستند القياسي C ++؟

هل كانت مفيدة؟

المحلول

س 1: أعتقد ذلك.

س 2: التوافق مع C. عندما تعلن أ struct في C ، اسم العلامة هو ذلك ، اسم علامة. لتكون قادرًا على استخدامه بطريقة مستقلة ، تحتاج إلى ملف typedef. في C ++ ، لا تحتاج إلى typedef ، مما يجعل Live أسهل. لكن قواعد C ++ كانت معقدة من خلال الحاجة إلى أن تكون قادرة على استيراد رؤوس C الموجودة بالفعل والتي "تم تحميلها" اسم العلامة باسم وظيفة. المثال الكنسي على ذلك هو UNIX stat() الوظيفة التي تستخدم أ struct stat* كحجة.

س 3: عادة ما تكون القراءة القياسية صعبة للغاية ... تحتاج إلى معرفة أنه لا يوجد مكان آخر في مكان آخر تعديل ما تقرأه. ليس من الغريب أن الناس يعرفون كيفية القيام بذلك هم محامي اللغة ...

نصائح أخرى

أنت مخطئ بشأن التعليق الثاني. في S::x, ، ال S هو اسم في محدد الاسم المتداخل. ما يشير إليه المعيار بـ "المحدد الأساسي" هو ما يلي

namespace B { struct X { }; void X() }
struct A : B::X { }; // B::X is a base-specifier

أنت أيضًا غير محق في هذا:

::S(); // محدد الاسم المتداخل ، يتجاهل إعلان الهيكل 's'.`

هذا الرمز يدعو الوظيفة ليس بسبب ::S سيكون محددًا متداخلًا (ليس محددًا متداخلًا!) ، ولكن لأن أسماء الوظائف تخفي أسماء الفئة أو التعداد إذا تم إعلان كل من الوظيفة والفئة/التعداد في نفس النطاق.

FWIW ، سيكون الرمز التالي ساريًا بنفس القدر للخط 2 من الرئيسي الخاص بك

p->S::f();

المهم هو ذلك S Precedes أ ::, مما يجعل البحث يتجاهل الوظيفة. التي وضعتها :: قبل S ليس له أي تأثير في قضيتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top