ضع ثابتًا لإيقاف تحرير بيانات المؤشر مع تعزيز Share_ptr
سؤال
لذا تخبرني ويكيبيديا (بشكل صحيح على ما أعتقد) أنه لإيقاف تحرير بيانات المؤشر والمؤشر نفسه، يجب علي القيام بذلك:
void function(int const * const var)
هل هذه هي نفس هذه الوظيفة:
void function(const int * const var)
وفي هذه الحالة لماذا يسمح بذلك؟لأنني أعلم أنه لا يمكنك القيام بذلك بسبب خطأ مكرر في الترجمة:
void function(const int const * const var)
أريد بشكل أساسي أن أفعل الشيء نفسه باستخدام مؤشر التعزيز.هل سأفعل هذا:
void function(const boost::shared_ptr<int> const var)
وكيف سيؤثر ذلك على قدرتي على تكرار مؤشر مشترك للمتجه؟هل يمكنني أن أفعل هذا مع ذلك الحارس:
void function(const boost::shared_ptr<std::vector<int>> const var)
{
for (unsigned int i = 0; i < var->size(); ++i)
{
std::cout << var[i];
}
}
إضافة:بعد إجابة براين
لذلك إذا قمت بإنشاء مؤشر مثل هذا:
boost::shared_ptr<vector<int>> lala
وأنا أستخدمها في هذه الوظيفة:
function (const boost::shared_ptr<std::vector<const int>> var)
هل سيصلح هذا؟
المحلول
نعم، int const * const var
بالضبط مثل const int * const var
.يمكنك وضع const
قبل أو بعد النوع الذي يعدله، "لأسباب تاريخية".يرى http://www.stroustrup.com/bs_faq2.html#constplacement
بالنسبة لكائن المؤشر الذكي، لا يمكنك فعل ذلك بالفعل
const boost::shared_ptr<int> const
لأن كلاهما const
تعديل نفس النوع.بدلا من ذلك، تريد
const boost::shared_ptr<const int>
الأول const
يمنع تعديل المؤشر نفسه (أي., ، إعادة تعيينها للإشارة إلى آخر int
) و ال const
في معلمة القالب تخبر الكائن operator*
للعودة أ const int&
, ، مما يمنع التعديل int
وأشار إلى.
هذا لا يمنع التكرار على ناقل أو حاوية أخرى بالطريقة التي وصفتها، لنفس السبب الذي يجعلك لا تزال قادرًا على التكرار على const
ناقلات بشكل طبيعي.
تحرير ردا على تحرير السؤال:
هذا يعمل:
void f(const boost::shared_ptr<const std::vector<int> > var);
// ...
boost::shared_ptr<vector<int> > lala;
f(lala);
الأول const
في المعلمة لا يؤثر على تمرير المعلمة على الإطلاق؛فهو يخبر الوظيفة نفسها فقط بعدم تعديل المعلمة.السبب وراء إمكانية إضافة أ const
في معلمة القالب هو أن أ boost::shared_ptr<T>
يمكن تهيئة من boost:shared_ptr<U>
أين T
و U
ليست بالضرورة نفس النوع، طالما U*
قابل للتحويل ضمنيًا إلى T*
.لو T
بالضبط مثل U
إلا مع مؤهل سيرة ذاتية أكبر، كما هو الحال في هذه الحالة، يكون التحويل ممكنًا.
لا تفعل std::vector<const int>
.أنا متأكد إلى حد ما أن هذا غير قانوني.(على الأقل ظهرت لي شاشات متعددة لأخطاء الترجمة في كل مرة جربتها.)
نصائح أخرى
const قبل أو بعد int هو نفسه:
giveacodicetagpre.و
giveacodicetagpre.هي نفسها وتعني القيمة المدببة لا يمكن تغييرها
const بعد * يعني عدم إعادة تعيين المؤشر.
إذا فهمت بشكل صحيح، كنت ترغب في جعل ناقلات const.إذا كان هذا هو الحال، فسيكون بناء الجملة هذا:
giveacodicetagpre.يتم تمرير المؤشر الذكي عن طريق الرجوع إلى المرجع لأنه أرخص من اجتياز المؤشر الذكي حسب القيمة ولديه نفس التأثير.الكائن المشار إليه من قبل المؤشر الذكي غير قابل للتغيير عن طريق الإعلان عن النوع الذي يشير إليه كما const.
لقد استنتجت ذلك بشكل صحيح const shared_ptr<Foo>
لا يجعل Foo كائنًا ثابتًا.تم وصف هذه "الثغرة" في ويكيبيديا.بدلاً من ذلك، تحتاج إلى تغيير نوع المؤشر المخزن بواسطة Boost::shared_ptr.يمكن القيام بذلك في وسيطة القالب نفسها:
void function(const boost::shared_ptr<const std::vector<int>>& var)
يحتوي Boost::shared_ptr على مُنشئ نسخ يسمح بنسخ نوع ثابت من نوع غير ثابت.ولا ينبغي أن يكون العكس ممكنا.
قبل او بعد؟
السطران أدناه متكافئان لغويًا، وكلاهما يعلن عن مؤشر لا يمكن تغيير قيمته، ويشير إلى int
لا يمكن تغييره.
int const * const p1 = ...;
const int * const p2 = ...;
ال مقدار ثابت ترتبط الكلمة الأساسية بكل ما هو موجود على اليسار مباشرة، إلا إذا لا يوجد شيء على اليسار، وفي هذه الحالة سوف يعانق كل ما هو على اليمين.
الاكثر const
, ، الافضل؟
typedef boost::shared_ptr<int> shared_int_ptr;
const shared_int_ptr const p3; // ill-formed
ما سبق typedef يتم توفيرها لتسهيل رؤية ذلك boost::shared_ptr<int>
هو اسم واحد، وبالتالي لا يمكننا أن نضيف const
على كلا الجانبين؛ينسخ الثوابت هي (كما ذكرت) ليست قانونية C++.
مجرد تطبيق واحد لن يكون كافيًا أيضًا، لأن ذلك من شأنه أن يجعل الغلاف مقدار ثابت, ، ولكن ليس الكائن الداخلي الذي يشير إليه ( كثافة العمليات).
سابقا كتبنا ذلك boost::shared_ptr
يجب أن يلتف حول int
, ولكن بما أننا نريد أن نصنع النوع المغلف const
, ، حسنًا..دعونا التفاف Shared_ptr حول ما نريد:
void func (const boost::shared_ptr<const int> foo);
في ما سبق func
غير قادر على التعديل foo
, ، ولا int
المشار إليها من قبل foo
.