Следующий пример кода прекрасно компилируется в Visual C ++:
class Test {
private:
struct {
struct {
int privateData;
};
};
};
int main(int, char **)
{
Test test;
test.privateData = 0;
return 0;
}
Но почему? Я ожидаю ошибку компилятора, потому что privateData
элемент должен быть недоступен функции main, так как она должна быть private
как контейнер его контейнера.
Я знаю, что безымянные структуры не являются частью официального C ++, но этот дизайн является оригинальным.
Кстати я тоже пытался изменить private
в protected
а также struct
в union
Похоже, что компилятор отказывается учитывать модификаторы доступа для анонимных структур и объединений, которые вложены в другую анонимную структуру или объединение.
Может кто-нибудь объяснить эту функцию?
Да, это ошибка. Microsoft подтвердила это, отчет обратной связи это здесь.
Сейчас ошибка находится в состоянии «не исправит», и неясно, когда (если когда-либо) она будет устранена. Для этого есть несколько странный обходной путь, парсер IntelliSense, встроенный в Visual Studio, написанный Edison Design Group, жалуется на это. Вы получите красные загогулины и сообщение:
Ошибка: элемент «Test.privateData» (объявлен в строке 10) недоступен
Других решений пока нет …