مساحة الاسم باستخدام إعلان (علة في GCC/VS2010)؟
-
27-09-2019 - |
سؤال
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
}
وبالمثل ، فإن الكود الخاص بك غير مشكل أيضًا.