В этой теме можно помещать информацию о известных или предполагаемых вами багах в Visual Studio C++ 2010, на известие о которых поступил ответ от Microsoft.
Одно из таких сообщений, которое я отослал в Microsoft касается следующего, как я считал, бага, и как это подтвердила Microsoft.
Чтобы лучше понимать вопрос, следует сначала обратиться к языку С. В языке С структуры, объединения и перечисления находятся в отдельном пространстве имен от пространства имен других идентификаторов объектов. Это объясняется тем, что перед именем структуры, объекдинения или перечисления в С всегда пишется сначала идентификатор типа, то есть ключевое слово
struct,
union или
enum. Поэтому один и тот же идентификатор можно использовать для обозначения, например, структуры и скалярной переменной, не беспокоясь о коллизии.
Например, в С можно смело писать
struct A
{
int A;
};
так как если мы хотим использовать структуру, то всегда нужно перед идентификатором ставить ключевое слово
struct. например,
void f();
{
struct A a = { 10 };
printf( "%d\n", a.A );
}
Однако в С++ имя структуры само по себе означает тип, а потому при объявлении переменных обычно не пишут ключевое слово
struct, а определяют объекты данного типа как
A a1;
Поэтому в С++ может возникнуть коллизия имени структуры и такого же имени объекта. В стандарте С++ четко оговорено, в каком случае имя члены структуры может совпадать или не совпадать с именем самой структуры. Это описано в разделе
9.2 Class members #13 В частности, если класс не имеет явно объявленного конструктора, то не статический член класса, имеющего фундаментальный тип, может иметь имя, совпадающее с именем класса (структуры). То есть следующий код
struct A
{
int A;
};
является корректным и для С++.
Однако компилятор MS VC++ 2010 не компилирует этот код, выдавая сообщение об ошибке:
"error C2380: типы перед "A" (конструктор с возвращаемым типом или недопустимое переопределение текущего имени класса?)" где-то месяц назад я получил ответ от Microsoft на обнаруженный мною баг. Вот их ответ:
цитата: |
Thank you for reporting this issue. This has been known to be an long-standing non-conformance in the compiler but it's really a corner case: note that it prevents the declaration of a constructor. Due to its nature, we regret that we will not fix this issue in the next release of the compiler. Tanveer Gani Visual C++ Team. |
|
Как видно из ответа, в Microsoft уже давно знают о существовании этого бага, но тем не менее в ближайшее время не собираются его исправлять, считая, что с данным багом компилятора пользователи не так часто будут сталкиваться в своих проектах.
Тем не менее следует знать, что в этом вопросе компилятор MS VC++ 2010 не соответствует стандарту С++.