Почему компилятор MSVC предоставляет доступ к этой закрытой функции без предупреждения или ошибки? - PullRequest
6 голосов
/ 16 марта 2019

Почему MSVC создает это без каких-либо ошибок или предупреждений?Что-то двусмысленное в этом коде?Компилятор GCC возвращает ошибку, потому что функция f является закрытой.

#include <stdio.h>

class A {
private:
    bool f(void) {return true;};
};

class B : public A {
};

class C : public B {
public:
    using A::f;
};

int main() {
    C c;
    if (c.f()) {
        printf("Access to private function\n");
    }
    return 0;
}

Для примера посмотрите здесь: https://godbolt.org/z/I5mUSa

1 Ответ

3 голосов
/ 16 марта 2019

Это ошибка MSVC. [namespace.udecl] / 18 :

В деклараторе использования, который не называет конструктор, все члены набора введенных объявлений должны быть доступны. В деклараторе использования, который называет конструктор, проверка доступа не выполняется.В частности, если производный класс использует декларатор using для доступа к члену базового класса, имя члена должно быть доступно.Если это имя перегруженной функции-члена, тогда все названные функции должны быть доступны.Члены базового класса, упомянутые в объявлении-использовании, должны быть видны в области действия хотя бы одного из прямых базовых классов того класса, в котором указан декларатор-использования.

Поскольку A::fнедоступен в C, программа некорректна (на using A::f), поэтому компилятор должен ее отклонить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...