Подтвердить что ты не робот

Выделение типа "auto" компилируется, а явный тип дает ошибку

Я использую Visual Studio 2012, и я нашел нечто странное. Я не пишу что-то, что обязательно необходимо для совместимости с несколькими компиляторами, но может быть позже (когда код помещается в веб, пользователи не хотят получать ошибки компилятора), но я не хочу писать что-то не так или просто не является родным.

Итак, это тестовый код:

class A{
    class B{
        public:
        int i;
    };
    B myB;
public:
    B& getB() { return myB; }
};

int main()
{
    A a;
    A::B& b = a.getB();
    auto& b2 = a.getB();
}

Первая строка внутри основного списка error C2248: 'A::B' : cannot access private class declared in class 'A', тогда как вторая строка компилируется нормально. Интересно, автоматически предполагается, что это работает или это еще одна ошибка в Visual Studio?

У меня нет другого компилятора, с которым я могу проверить его с помощью

Вы даже можете писать такие вещи, как std::cout << b2.i << "\n";, и он компилируется отлично.

В соответствии с комментарием πάντα ῥε, я пробовал ideone с gcc 4.8.1, и он компилируется таким же образом, первая строка - ошибка, вторая строка - отлично.

4b9b3361

Ответ 1

Я считаю, что он должен работать так. Доступ применяется к именам, а не к сущностям, к которым они относятся.

Даже без auto он всегда был законным, например, передайте результат getB функции, ожидающей a B.

Ответ 2

auto должен работать так, да, и да, это означает, что он может выставлять частные типы.