Использование имени из шаблонного наследника в MSVC

Почему этот код компилируется компилятором x64 msvc v19.24 с опциями /std:c++17 /Wall /W4 без предупреждений? Это баг? Можно ли как-то заставить выдавать хотя бы предупреждение, типа опции -pedantic в gcc?

template <typename T>
struct A {
    int x = 42;
};

template <typename T>
struct B : A<T> {
    int f() { 
        return x;
    }
};

int main() {
    B<int> b;
    b.f();
}

Ответы (1 шт):

Автор решения: user7860670

Это нестандартное поведение. В компиляторе msvc долгое время не был реализован двухфазный поиск имен, но потом его добавили, а чтобы не ломать старые приложения старое поведение оставили в permissive режиме. Соответственно аргумент /permissive- среди прочего выключает это старое поведение и заставлять компилятор компилировать в соответствии со стандартом и выдавать на этом примере ошибку.

Microsoft C++ language conformance table

→ Ссылка