Последнее объявление имеет приоритет:
[C++03: 9.1/2]:
Определение класса вводит имя класса в область, в которой оно определено, и скрывает любой класс, объект, функцию или другое объявление этого имени в прилагаемой области (3.3). Если имя класса объявлено в области видимости, где объект, функция или перечислитель с тем же именем также объявлены, тогда, когда оба объявления находятся в области видимости, к классу можно обращаться только с использованием подробного спецификатор типа (3.4.4).
подробный спецификатор типа - это когда вы вставляете struct
или class
в начале типа; это фактически устраняет неоднозначность, хотя, строго говоря, и из-за приведенного выше правила поиск, во-первых, никогда не был действительно двусмысленным.
Итак:
void foo()
{
struct bar {};
bar bar[5];
memset(bar, 0, sizeof(bar));
// ^^^^^^^^^^^
// 5
memset(bar, 0, sizeof(struct bar));
// ^^^^^^^^^^^^^^^^^^
// 1
}
// (NB. Exact sizes may differ; 1 and 5 given as relative examples only)
Тот факт, что все это четко определено, является одной из причин, по которой вы не получили предупреждение. Тем не менее, я бы надеялся , что интеллектуальный компилятор определит ваш код как возможную ошибку программиста & mdash; рационализация того, почему какая-то конкретная реализация выдает или не выдает какое-то данное предупреждение в некомандатном случае, однако, в значительной степени глупо.