كيف يحدد معيار C ++ 0X إعلانات متعددة C ++ السيارات؟

StackOverflow https://stackoverflow.com/questions/493401

  •  20-08-2019
  •  | 
  •  

سؤال

وط ط ط، لدي سوى القليل من الارتباك حول إعلانات السيارات متعددة في مستوى C ++ 0X القادم.

auto a = 10, b = 3.f , * c = new Class();

وفي مكان ما قرأت من غير المسموح به. وكان السبب (؟) لأنه لم يكن من الواضح ما إذا يجب أن يكون إعلانات متتالية من نفس النوع من أول واحد، (الباحث في المثال)، أم لا.

والمحتملة الترجمة 1:

int a = 10; 
int b = 3.f; 
int * c = new Class ();

وتسبب خطأ

والمحتملة الترجمة 2:

int a = 10;
float b = 3.f;
Class * c = new Class (); 

وكيف أدى ذلك في المعيار؟

إذا أستطيع أن أقول بلدي بوف، كان ترجمة رقم 2 أكثر obiouvs، على الأقل بالنسبة لي أنني العادية المستخدم C ++. أعني، بالنسبة لي "كل متغير المعلن هو من نفس نوع أعلن"، ساحرة السيارات. أن ترجمة # 1 أن يكون حقا إلغاء بديهية بالنسبة لي.

وداعا جيد QbProg

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

المحلول

وانها ربما لا يكون الأخير، ولكن لي C ++ 0X مشروع المواصفة من يونيو 2008 يقول يمكنك القيام بما يلي:

auto x = 5; // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int

وذلك ما لم يكن قد تغير شيئا من يونيو من هذا هو (أو سيتم) المسموح بها في شكل محدود مع تفسير بديهية جدا.

والقيد هو أنه إذا كنت لا تريد لسلسلة إعلانات السيارات متعددة مثل هذا (باستخدام المثال أعلاه)، وأنها تعمل لأن نوع الاستدلال من v وu لديهم نفس "نوع قاعدة" (الباحث في هذه الحالة) لاستخدام وهو مصطلح غير دقيق.

إذا كنت ترغب في قاعدة دقيقة، مشروع معيار يقول هذا:

<اقتباس فقرة>   

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

حيث يتم تحديد "معلمة قالب استنتاجها U" حسب:

<اقتباس فقرة>   

ونوع استخلاصه من المعلمة يو في و دعوة (EXPR) من القالب وظيفة اخترع التالية:

 `template <class U> void f(const U& u);`

وماذا هم قد وصلنا مع هذه القاعدة بدلا من أن تقول شيئا مثل:

auto a = 10, b = 3.f , * c = new Class();

وما يعادل:

auto a = 10;
auto b = 3.f;
auto * c = new Class();

وأنا لا أعرف. ولكن أنا لا أكتب المجمعين. ربما أن تفعل شيئا مع مرة واحدة كنت قد برزت محل الكلمة auto، لا يمكنك تغييره في البيان نفسه.

وخذ على سبيل المثال:

int x = 5;
CFoo * c = new CFoo();

auto  a1 = x,       b1 = c; // why should this be permitted if
int   a2 = x, CFoo* b2 = c; // this is not?

في أي حال، أنا لست من محبي وضع إعلانات متعددة على نفس البيان على أي حال.

نصائح أخرى

صياغة القياسية قسم 7.1.6.4 يعني أنه لا يمكنك خلط أنواع مثل في ترجمة ممكنة 2. حتى لا ترجمة ممكنة صالحة.

وهناك بعض النقاط التي أعتقد مساعدة تسهم في الصياغة الحالية. الأول هو الاتساق. إذا كنت أكتب إعلانا مثل:

int j;
int i = 0, *k = &j;

وبعد ذلك، هذين النوعين كليهما استخدام <م> الباحث في مكان ما في نوعها. ومن خطأ على سبيل المثال، إذا كان "ي" أ "الباحث CONST. وجود <م> السيارات العمل نفسه هو "ثابت" مع النموذج الحالي لمثل هذه التصريحات.

ويتم بعد ذلك هناك ميزة العملية من وجهة نظر الكاتب البرمجي. هناك بالفعل وجود آلية في المجمعين لأداء نوع خصم لاستدعاء دالة (الذي هو كيف <م> السيارات يوصف بأنه التشغيل). القاعدة المذكورة أعلاه تتفق مع القاعدة التي خصم لمعلمة قالب يجب أن يؤدي إلى نفس النوع:

template <typename T> void foo (T, T*);

void bar ()
{
  int i;
  const int j = 0;

  foo (i, &i);  // OK deduction succeeds T == int
  foo (i, &j);  // ERROR deduction fails T == int or const int.
}

وتنفيذا السهل على السيارات هي إعادة استخدام اليات الحالية للاستدلال على نوع ل <م> السيارات ، ونظرا لتوافقها مع السلوكيات الحالية نتيجة لن يكون من المستغرب جدا للناس.

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

ما هو أكثر من ذلك، فإن هذا التوسع لا كسر التعليمات البرمجية التي تستخدم الصيغة الحالية لل<م> السيارات . النظر في ما إذا فعلوا ذلك على العكس من ذلك. إذا كانت نسخة موسعة من السيارات كان الإصدار الأول، وهذا أدى إلى بعض الخلل غريب وقاتل مع الكلمة بعد ذلك سيتطلب إزالة ميزة اللغة من المعيار - وهو أمر يحدث أبدا تقريبا انها على الأرجح فواصل التعليمات البرمجية.

وقال إن أول نوع واحد من يصطف مع الطريقة التي يعمل نوع الاستدلال في نوع الإرجاع:؟ المشغل

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