среда, 10 января 2024 г.

[prog.c++.wtf] Публичный член приватного вложенного типа?

Еще одно открытие для меня в языке C++, которым пользуюсь уже больше 30 лет:

class Outer {
    struct Inner {
        int m_a{};
        int m_b{};
    };
public:
    Inner m_i;
};

int main()
{
    Outer o;
    o.m_i.m_a = 3;
    o.m_i.m_b = 4;
}

Оказывается, так можно. Цынк.

Что меня выморозило в этом примере: мы же класс Inner сделали закрытым вложенным классом для Outer. Т.е. вроде как, по логике вещей, классом Inner могут пользоваться только сам Outer и его друзья.

Но ничего нам не запрещает объявить в Outer публичный член Outer::m_i приватного, вроде бы, типа Outer::Inner. И любой желающий может работать с таким объектом приватного типа Outer::Inner.

Впервые с таким столкнулся. Я, честно говоря, ожидал, что компилятор не должен позволить объявить публичный Outer::m_i. Но, в очередной раз, ошибся 🥴


На правах саморекламы: изобретаю велосипеды для себя, могу изобретать и для вас.

Комментариев нет: