سؤال

namespace A{
   int i;
}

int main(){
   using A::i;
   using A::i;
}

VS2010 - تجميع جيد

GCC (IDEONE) - تجميع غرامة

Comeau - تعطي خطأ "" comeautest.c "، السطر 10: خطأ:" أنا "تم الإعلان عنه بالفعل في النطاق الحالي باستخدام A :: I ؛"

$ 7.3.3/8 - "A استخدام النهر هو إعلان وبالتالي يمكن استخدامه مرارًا وتكرارًا حيث يُسمح (وحيث فقط) بالإعلانات المتعددة."

يشير المثال هناك إلى أن الكود غير مشكل بالفعل.

إذن ، هل هذا خطأ في GCC و VS2010؟

تحرير 2:

قم بإزالة المضاعفات using directives كما كان لا علاقة له بالاستعلام في متناول اليد.

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

المحلول

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

إذن ، هل هذا خطأ في GCC و VS2010؟

لا أعتقد أنه خطأ في أي من GCC/VS2010/Clang أو Comeau. يبدو أنه خطأ في معيار C ++. في هذه الحالات ، يتعين على كتاب التجميع أن يقرروا ما هو أكثر قابلية للتطبيق. إذا قمت بإزالة المثال المعني ، فإن 3.3/4 ينص على أن المثال صالح: "بالنظر إلى مجموعة من الإعلانات في منطقة تصريبية واحدة ، يحدد كل منها نفس الاسم غير المؤهل ، ... يجب أن يشير جميعًا إلى نفس الكيان ، أو جميع الإشارة إلى الوظائف وقوالب الوظائف ؛ أو ... ".

ينشأ السؤال ، كما تمت مناقشته في القضية المرتبطة ، ما يشير إليه 7.3.3/8 عندما تقول "الإعلانات" ، والتي لم تصل اللجنة إلى توافق في الآراء بشأنها. وهكذا ، حتى ذلك الحين ، ينطبق 3.3/4 على GCC/VS2010 و Clang ، بينما يختار Comeau استخدام بعض الدلالات الأخرى.

نصائح أخرى

نعم كلامك صحيح. هذا بالفعل خطأ في G ++ و MSVC ++ و Clang. لقد حصل Comeau على صحيح.

كما قلت 7.3.3/8 يقول

A-Declaration هو إعلان وبالتالي يمكن استخدامه بشكل متكرر حيث يسمح (وحيث فقط) إعلانات متعددة

يتم تقديم مقتطف الكود التالي أيضًا.

void f()
{
    using A::i;
    using A::i;  //error: double declaration
}

وبالمثل ، فإن الكود الخاص بك غير مشكل أيضًا.

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