سؤال

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

بعد قراءة بعض مواد تمهيدية على مفاهيم C++0x (حتى وقت قريب) المقترحة لهم ، أواجه مشكلة التفاف رأيي حول بعض المسائل النحوية.دون مزيد من اللغط, وإليك أسئلتي:

1) النوع الذي يدعم معين المستمدة من مفهوم (إما ضمنيا عبر الكلمة السيارات ، أو صراحة عبر concept_maps) تحتاج أيضا إلى دعم مفهوم قاعدة indepdendently?وبعبارة أخرى ، هل قانون اشتقاق المفهوم من أخرى (مثلا ، concept B<typename T> : A<T>) ضمنا تشمل 'غير مرئية' يتطلب بيان (في ب ، requires A<T>;)?الارتباك الذي يطرح نفسه من صفحة ويكيبيديا على المفاهيم التي تنص على:

مثل في الصف الميراث ، أنواع تلبية متطلبات المشتقة مفهوم أيضا تلبية متطلبات قاعدة المفهوم.

يبدو أن نقول أن نوع يحتاج فقط إلى إرضاء المستمدة من مفهوم متطلبات وليس بالضرورة مفهوم قاعدة متطلبات الذي لا معنى له بالنسبة لي.أنا أفهم أن ويكيبيديا هي بعيدة عن نهائي المصدر ؛ هو الوصف أعلاه مجرد سوء اختيار الكلمات ؟

2) يمكن أن مفهوم القوائم typenames يكون 'السيارات'?إذا كان الأمر كذلك ، كيف مترجم خريطة هذه typenames تلقائيا ؟ إن لم يكن, هل هناك أي مناسبات أخرى حيث أنها ستكون غير صالحة للاستخدام 'السيارات' على المفهوم ؟

للتوضيح النظر في الافتراضي التالي: كود:

template<typename Type>
class Dummy {};

class Dummy2 { public: typedef int Type; };

auto concept SomeType<typename T>
{
     typename Type;
}

template<typename T> requires SomeType<T>
void function(T t)
{}

int main()
{
    function(Dummy<int>()); //would this match SomeType?
    function(Dummy2()); //how about this?
    return 0;
}

إما من تلك الفئات مباراة SomeType?أو هو concept_map اللازمة المفاهيم التي تنطوي typenames?

3) أخيرا, أنا أعاني من صعوبة في فهم ما البديهيات لن يسمح لتحديد.على سبيل المثال ، يمكن أن لدي مفهوم تعريف البديهية والتي هي منطقيا متناسقة ، مثل

concept SomeConcept<typename T>
{
    T operator*(T&, int);

    axiom Inconsistency(T a)
    {
         a * 1 == a * 2;
    }
} 

ماذا يمكن أن تفعل ؟ هو أنه حتى صالحة ؟

أنا أقدر أن هذا هو وقت طويل جدا مجموعة من الأسئلة لذا شكرا لكم مقدما.

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

المحلول

لقد استعملت أحدث C++0x مشروع ، N2914 (الذي لا يزال لديه مفاهيم الصياغة في ذلك) كمرجع الجواب التالي.

1) مفاهيم مثل واجهات في ذلك.إذا كان لديك نوع يدعم مفهوم ، وينبغي أيضا دعم كل "القاعدة" المفاهيم.ويكيبيديا بيان الاقتباس من المنطقي من وجهة نظر من نوع العميل - إذا كان يعلم أن T يرضي مفهوم Derived<T>, ثم هو أيضا يعرف أنه يرضي مفهوم Base<T>.من نوع المؤلف المنظور ، وهذا يعني بطبيعة الحال أن كل من سيتم تنفيذها.انظر 14.10.3/2.

2) نعم, وهو مفهوم typename أعضاء يمكن auto.هذه الأعضاء يمكن أن يكون تلقائيا استخلاصه إذا تم استخدامها في تعريف وظيفة أعضاء في نفس المفهوم.على سبيل المثال ، value_type بالنسبة مكرر يمكن استخلاصه بمثابة عودة نوع من operator*.ومع ذلك ، إذا كان نوع الأعضاء هو عدم استخدامها في أي مكان ، فإنه لن يكون استخلاصه ، وبالتالي لن يكون ضمنيا محددة.في المثال الخاص بك, ليس هناك طريقة للاستدلال SomeType<T>::Type إما Dummy أو Dummy1, ، Type لا يستخدم من قبل أعضاء آخرين من مفهوم ولا حتى الطبقة خريطة مفهوم (وفي الواقع ، أي فئة يمكن أن خريطة السيارات إلى ذلك).انظر 14.10.1.2/11 14.10.2.2/4.

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

المحددة الخاصة بك على سبيل المثال (وهو ما يمثل النحوية الفرق) ، فإن ذلك يعني أن المترجم لن يسمح للنظر في التعبير (a*1) نفسه (a*2), لغرض "كما لو كانت" القاعدة اللغة (أيالمحول يسمح لك أن تفعل أي تحسينات يريد طالما النتيجة يتصرف كما لو لا توجد).غير أن المترجم ليس في أي طريقة من أجل التحقق من صحة البديهيات (وبالتالي لماذا يطلق عليهم البديهيات!) - فإنه يأخذ فقط لهم على ما هم عليه.

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