سؤال

Observation: the codes pasted below were tested only with GCC 4.4.1, and I'm only interested in them working with GCC.

مرحبًا،

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

لنفترض أن هناك فئة يأخذ مُنشئها حجة واحدة فقط ، ونوع هذه الوسيطة هو فئة أخرى مع مُنشئ افتراضي. على سبيل المثال:

struct ArgType {};

class Class
{
public:
    Class(ArgType arg);
};

إذا حاولت إنشاء كائن من النوع Class على المكدس ، أحصل على غموض:

Class c(ArgType()); // is this an object construction or a forward declaration
                    // of a function "c" returning `Class` and taking a pointer
                    // to a function returning `ArgType` and taking no arguments
                    // as argument? (oh yeh, loli haets awkward syntax in teh
                    // saucecode)

أقول إنه بناء كائن ، لكن المترجم يصر على أنه إعلان إلى الأمام داخل جسم الوظيفة. بالنسبة لك من لا يحصل عليها ، إليك مثال يعمل تمامًا:

#include <iostream>

struct ArgType {};
struct Class {};

ArgType func()
{
    std::cout << "func()\n";
    return ArgType();
}

int main()
{
    Class c(ArgType());

    c(func); // prints "func()\n"
}

Class c(ArgType funcPtr()) // Class c(ArgType (*funcPtr)()) also works
{
    funcPtr();
    return Class();
}

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

-- تعديل

لا يهم. هذا خداع معظم التحليل المزعج: لماذا لا A (()) ؛ الشغل؟.

شكرا ، SBI.

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

المحلول

يُعرف هذا باسم "تحليل C ++ الأكثر تحرشًا". يرى هنا و هنا.

نصائح أخرى

دعونا نبسيط قليلا.

int f1();

ما هذا؟ يقول المترجم (وأنا) إنه إعلان إلى الأمام لوظيفة تعيد عدد صحيح.

وماذا عن هذا؟

int f2(double );

يقول المترجم (وأنا) إنه إعلان إلى الأمام لوظيفة تأخذ حجة مزدوجة وإعادة int.

هل جربت هذا:

ClassType c = ClassType(ArgType());

تحقق من C ++ Faq Lite On المنشئون ل تفسيرات والأمثلة

بناءً على "C ++ 0x المسموح به" ، فإن الإجابة الصحيحة هي (ربما) تغيير التعريف إلى:

Class c(ArgType {});

بسيط ومباشر ويضع العبء بالكامل على مستخدم المكتبة ، وليس المؤلف!

تحرير: نعم ، يتم استدعاء CTOR-C ++ 0x يضيف تنصيب القائمة كطريقة لا لبس فيها لخصوص قوائم التهيئة. لا يمكن أن يتم إساءة استخدامها كما في العينة ، ولكن على خلاف ذلك ، فإن المعنى هو نفسه كما لو كنت تستخدم الأقواس. يرى N3000, ، نقطة الرصاصة الثالثة بموجب الفقرة 8.5.4/3. يمكنك كتابة CTOR لتلقي قائمة المهيمنة كوسيطة واحدة ، أو يمكن مطابقة العناصر الموجودة في قائمة التهيئة مع وسيطات CTOR بشكل فردي.

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